Bonjour,
j'ai un problème à résoudre. Le problème s'intitule "tri par inversion" (sorting by reversal) et qui se présente comme suit: étant donnée une permutation quelconque (par exemple 3 1 2 4), on désire transformer cette permutation en l'identité (1 2 3 4) en un nombre minimum d'étapes et en utilisant l'inversion (par exemple l'inversion de 3 1 2 4 est 4 2 1 3). Une manière de se faire est de comparer l'élément p(i) de la permutation p avec l'indice i de sa position, s'ils sont égaux on passe à l'émément suivant sinon on applique une inversion entre i et la position de p(i). L'idée de cet algorithme s'inspire du faite que dans la permutation identité chaque élément est égal à l'indice de sa position. Mais cet algorithme ne garantie pas le plus petit nombre d'inversion vu que si on l'applique sur cette permutation (6 1 2 3 4 5) on obtiendra 5 inversions donc 5 étapes alors que cette permutation peut être triée en 2 étapes sulement: (6 1 2 3 4 5) -> (5 4 3 2 1 6) -> (1 2 3 4 5 6).
Je serai vraiment reconnaissante si vous m'aidez à résoudre ce problème.
Merci


Merci bien pour votre réponse. Mais j'ai quelques remarques à vous dire: Les 4 dernières étapes ne sont pas assez claires. En effet, dans la quatrième étape, si l'indice de k dans p2 est 1 (donc i=1) alors on aura p4=p2 et p3 sera inexistante! Vous pouvez appliquer votre algorithme sur la permutation suivante (1 2 3 5 7 4 6 8 9).
C'est une bonne idée mais à rectifier! D'après mes recherches, j'ai trouvé aussi qu'il est possible d'utiliser la notion de point de rupture (breakpoint): deux éléments de la permutation qui ne sont pas consécutifs constituent un point de rupture (exemple: (3 5) est un point de rupture). Si vous remarquez, dans la permutation identité il n'y aucun point de rupture donc le problème se ramène à minimiser le nombre de points de rupture jusqu'à obtenir la permutaion identité ( donc zéro point de rupture car dans la permutation dentité tous les éléments sont consécutifs). C'est une autre idée mais il reste à voir comment faire un algorithme qui minimise le nombre de points de rupture et en utilisant aussi l'inversion.
Merci bien.
Cordialement.
Non, l'indice de k dans p2 ne peut pas être i : "pour trouver le premier élément k!=i". Effectivement k=i va marcher, mais il faut ignorer ce cas.
Le cas qui peut arriver c'est que k n'existe pas, auquel cas p3=(p(i)...p(n)) et p4 n'existe pas. Ta permutation finale sera donc la concaténation des permutations p1 p6.
Cordialement
k peut être le premier élément de p2 donc p3 sera inexistante car on n' a pas l'élément k-1.
Si vous appliquer l'algorithme sur cette permutation 1 2 3 5 7 4 6 8 9 vous allez comprendre ce que j viens de dire.
Merci.
Cordialement.
Non, je pense que c'est toi qui m'as mal compris. Il y avait bien une erreur, mais je ne pense pas qu'elle se situait ici. Je t'écris ici un nouvel algorithme proprement :
- L'algorithme que l'on va écrire permet de trouver la permutation triée de la permutation donnée en entrée. Par exemple, le résultat de l'algorithme pour (1245736) sera (1234567) et celui de (432) sera (234).
- Soit I(p) l'inversion d'une permutation (I((1234)) = (4321) par exemple)
- Soit n le nombre d'éléments de la permutation (pour p=(1234), n = 4)
- Soit A(p, d) l'algorithme que l'on est en train d'écrire (c'est important car on va l'appeler récursivement). p est la permutation que l'on souhaite trier, et d est la valeur minimale moins 1 contenue dans la permutation. Par défaut (pour résoudre ton exercice), on va appeler A(p, 0) car ta permutation commence à 1.
- On effectue le test p(i) égal i+n (comme le début de ton algorithme). Dès que p(i+n) != i, alors on découpe la permutation p en p1 et p2. p1=(p(1) p(2) ... p(i-1)), donc est la permutation identité à l'ordre i-1. p2=(p(i)...p(n)).
Si on ne trouve aucun i correspondant, alors on retourne p.
- Soit p3 = A(p2, i). Si notre algorithme est correct, alors p3 est un sous-ensemble de la permutation identité (ie p3 est trié).
- On effectue alors la manipulation p = p1 I(p2(i) I(p3)). On retourne p
Je pense que cet algorithme là est correct. Quant à savoir s'il est optimal, ça je ne sais pas te le prouver.
Cordialement,
J'ai pas compris pourquoi tu compares p(i+n) avec i, en principe on doit comparer p(i) avec i.
Si on applique ton algorithme sur (1 2 3 5 7 4 6 8 9) donc d'après ce que j'ai compris p1=(1 2 3) et p2=(5 7 4 6 8 9), maintenant comment trouver p3 ( car dans p2 on va comparer 5 avec 1 (car i=1))?
Merci de me répondre.
Cordialement.
En fait, j'ai encore fait une erreur : je ne veux pas comparer p(i+n) avec i mais p(i) avec i+d.
C'est justement pour pouvoir trier les permutations qui ne commencent pas à 1 (comme p=(354) par exemple; ici je veux savoir si p(1) = 3).
Pour reprendre ton exemple, on va comparer 5 avec la valeur minimale de la permutation : 4. Comme c'est différent, je vais découper (574689) en 2 : (5) et (74689)...
Cordialement,
Merci bien pour votre réponse mais est-ce que vous pouvez appliquer tout votre algorithme sur l'exemple que je vous ai donné pour mieux comprendre? Merci.
Cordialement.