Auteur: Ludovic PATEY

Publié le 29 février 2008

Modifié le: 29 février 2008

Page d'accueil

Tester chaque permutation sur un ensemble E

Vous êtes ici : Accueil / Articles / Formations en Algorithmique

En analyse combinatoire, il arrive souvent de devoir tester chacune des permutations sur un ensemble. Nous allons voir comment l’implémenter en C.

Qu’est-ce qu’une permutation ?

Une permutation est une bijection d’un ensemble sur lui-même.

Qu’est-ce qu’une bijection ?

Une bijection est une application à la fois injective et surjective.

Qu’est-ce qu’une injection ?

Oh et puis zut..

Une approche intuitive

Nous disposons d’un ensemble fini de n éléments et voulons remplir un autre ensemble disposant de la même capacité. L’algorithme va avoir pour but de le remplir de toutes les manières différentes.

A la première place, nous aurons le choix de placer n éléments. Une fois ce premier élément placé, il nous reste n-1 éléments. Nous aurons donc n-1 choix pour la seconde place, pour chaque occurrence du premier élément, et ainsi de suite.

Le nombre de permutations possibles est de n !.

Il s’agit de trouver un algorithme simple permettant de créer ces permutations.

L’algorithme de backtracking

Un algorithme tout à fait approprié est celui du retour sur trace ( backtracking en Anglais ). En effet, il suit exactement le schéma de la pensée lorsque nous évaluons le nombre de combinaisons possibles.

Il consiste à affecter chaque élément de l’ensemble de départ au premier élément de l’ensemble d’arrivée, et pour chaque occurrence, il teste toutes les permutations sur le sous-ensemble constitué de l’ensemble de départ moins l’élément précédent.

Comme vous le voyez, l’algorithme de backtracking est un algorithme basé sur la recursion.

Implémentation en C

// Définition du nombre d'éléments du tableau
#define N_ELEMENTS 5

// Creation des ensembles
void * depart[ N_ELEMENTS ];
void * arrivee[ N_ELEMENTS ];

void backtracking( void ** depart, int n, void ** arrivee ) {

       int i;

       // Si l'ensemble d'arrivée est remplis
       if( n == 0 ) {

               // Se repositionner au debut du tableau
               arrivee -= N_ELEMENTS;

               // Code à exécuter pour chaque permutation
               ...

       }
       else {

               for( i=0; i<N_ELEMENTS; i++ ) {

                       // Ajout de l'élément dans l'ensemble d'arrivée
                       *arrivee = *(depart+i);

                       // Création de toutes les permutations
                       // Sur le sous-ensemble
                       backtracking( depart+1, n-1, arrivee+1 );

               }

       }

}


// Initialisation de l'ensemble de départ
....

// Exécution de l'algorithme
backtracking( depart, N_ELEMENTS, arrivee );

Commentaires

Auteur :

Message :