Si nous combinons les deux permutations, le résultat aura même la parité lorsque chaque permutation a la même parité et la parité impaire si elles ont la parité différente. Donc, si nous résolvons le problème de parité il est trivial de comparer deux permutations différentes.
La parité peut être déterminée comme suit: choisissez un élément quelconque, trouvez la position à laquelle la permutation se déplace, répétez jusqu'à ce que vous reveniez à celui avec lequel vous avez commencé. Vous avez maintenant trouvé un cycle: la permutation fait tourner tous ces éléments autour d'une position. Vous avez besoin d'un swap inférieur au nombre d'éléments du cycle pour l'annuler.Maintenant, choisissez un autre élément que vous n'avez pas encore traité et répétez jusqu'à ce que vous ayez vu tous les éléments. Observez qu'au total, vous avez besoin d'un échange par élément moins un échange par cycle.
La complexité temporelle est O (N) dans la taille de la permutation. Notez que bien que nous ayons une boucle dans une boucle, la boucle interne peut seulement itérer une fois pour n'importe quel élément de la permutation.
def parity(permutation):
permutation = list(permutation)
length = len(permutation)
elements_seen = [False] * length
cycles = 0
for index, already_seen in enumerate(elements_seen):
if already_seen:
continue
cycles += 1
current = index
while not elements_seen[current]:
elements_seen[current] = True
current = permutation[current]
return (length-cycles) % 2 == 0
def arePermsEqualParity(perm0, perm1):
perm0 = list(perm0)
return parity([perm0[i] for i in perm1])
Aussi, juste pour le plaisir, voici une mise en œuvre beaucoup moins efficace mais beaucoup plus courte de la fonction de parité basée sur la définition dans Wikipedia (retour vrai même pour et faux pour impair):
def parity(p):
return sum(
1 for (x,px) in enumerate(p)
for (y,py) in enumerate(p)
if x<y and px>py
)%2==0
Une permutation est-elle une liste de cycles disjoints? Une liste de paires de transposition? Une liste de paires '(s, σ (s))' (où σ est la permutation à représenter)? – outis
Outis: Je suppose que ça peut être les deux. –