Wenn wir beide Permutationen kombinieren, wird das Ergebnis gerade Parität haben, wenn jede Permutation die gleiche Parität hat, und ungerade Parität, wenn sie unterschiedliche Parität haben. Also, wenn wir das Paritätsproblem lösen, ist es trivial, zwei verschiedene Permutationen zu vergleichen.
Parität kann wie folgt bestimmt werden: Wählen Sie ein beliebiges Element, finden Sie die Position, zu der die Permutation dies verschiebt, wiederholen Sie, bis Sie zu demjenigen zurückkommen, mit dem Sie begonnen haben. Sie haben nun einen Zyklus gefunden: Die Permutation dreht alle diese Elemente um eine Position. Sie benötigen einen Swap weniger als die Anzahl der Elemente im Zyklus, um ihn rückgängig zu machen.Wähle nun ein anderes Element aus, mit dem du noch nicht fertig bist, und wiederhole es, bis du jedes Element gesehen hast. Beachten Sie, dass Sie insgesamt einen Tausch pro Element minus einen Tausch pro Zyklus benötigten.
Zeitkomplexität ist O (N) in der Größe der Permutation. Beachten Sie, dass, obwohl wir eine Schleife innerhalb einer Schleife haben, die innere Schleife nur einmal für jedes Element in der Permutation durchlaufen kann.
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])
Auch nur zum Spaß, hier ist eine viel weniger effizient, aber viel kürzer Umsetzung der Paritätsfunktion auf der Definition in Wikipedia basiert (für gerade und Falsch für ungerade wahre Rückkehr):
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
Ist eine Permutation eine Liste von disjunkten Zyklen? Eine Liste von Transpositions-Paaren? Eine Liste von '(s, σ (s))' Paaren (wobei σ die zu repräsentierende Permutation ist)? – outis
Outis: Ich denke, es kann beides sein. –