En essayant de concevoir mon propre algorithme de tri, je cherche le benchmark optimal auquel je peux le comparer. Pour un ordre non trié des éléments A et un ordre trié B , quel est un moyen efficace de calculer le nombre optimal de transpositions pour passer de A à B ?
Une transposition est définie comme la commutation de la position de 2 éléments dans la liste, donc par exemple
1 2 4 3
a une transposition (transposition 4 et 3) pour le rendre
1 2 3 4
Quelque chose comme
1 7 2 5 9 6
nécessite 4 transpositions (7, 2), (7, 6), (6,5), (9, 7)
Mise à jour (9/7/11): question modifiée pour utiliser la "transposition" au lieu de "swaps" pour faire référence aux échanges non adjacents.
Réponses:
Si vous ne traitez qu'avec des permutations de éléments, alors vous aurez besoin exactement de n - c ( π ) swaps, où c ( π ) est le nombre de cycles dans la décomposition en cycle disjoint de π . Comme cette distance est bi-invariante, la transformation de π en σ (ou A en B , ou inversement) nécessite n - c ( σ - 1 ∘ π ) de tels mouvements.n n - c ( π) c ( π) π π σ UNE B n - c ( σ- 1∘ π)
la source
La distance de permutation peut également être intégrée isométriquement dans l'espace euclidien. Pour chaque chaîne s, construisez une matrice où M i j = 1 si i se produit avant j et vaut zéro sinon. Alors la distance de Frobenius ‖ M ( s ) - M ( s ′ ) ‖ 2 est la distance d'échange . (à partir des diapositives de Graham Cormode ). Pas aussi élégant que la réponse d'Anthony, mais assez facile à calculer.M( s ) Mje j= 1 je j ∥M(s)−M(s′)∥2 d(s,s′)
Mise à jour: veuillez consulter les commentaires d'Oleksandr
la source