Finden der (lexikographische) index, der eine permutation von einer gegebenen array.
Gegeben ein array sagen "bca", ich muss die Anzahl der Permutationen, die lexicographicaly die größer als die angegebene permutation.
So, in diesem Beispiel, cab, cba sind Permutationen, die größer sind. Somit wäre die Antwort 2.
Ich versuchte Annäherung an das problem durch das finden der lexikographischen ranking des Arrays, aber ich bin nicht in der Lage zu entwickeln, die ein effizienter Algorithmus für die sagen.
Jede Hilfe/Zeiger in die richtige Richtung dankbar!
- Ist "bbb" eine gültige array?
- Haben Sie versucht, eine backtracking-Methode?, es ist nicht wirklich effizient, aber es macht seinen job. Wenn Sie wollen, dass ich post code mir sagen.
- Nein. die permutation gebildet werden müssen mit der gleichen Anzahl von literalen gemäß der üblichen definition
- Nein, ich bin nicht bewusst, die backtracking-Methode. Können Sie bitte erklären, und die post-code? Danke!
- Die Frage ist im wesentlichen, "Was ist ein effizienter Algorithmus, X zu tun?". Wie kann jemand beantworten, der ohne (pseudo) - code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten wir die permutation
dacb
. Wo kommt das in der lexikographischen Ordnung unter der 4! = 24 Permutationen vonabcd
?d
. Unter den restlichen Buchstaben (acb
) es sind drei Buchstaben, die kleiner alsd
und 3! = 6 Permutationen beginnen mit jedem von Ihnen, für eine Gesamtmenge von 18 Permutationen.da
. Unter den restlichen Buchstaben (cb
) es gibt keine Buchstaben, die kleiner alsa
(wenn es welche gab, es wären 2! = 2 Permutationen beginnend mitd
sowie jeweils eins), für eine Gesamtmenge von 0 Permutationen.dac
. Unter den restlichen Buchstaben (b
) es ist ein Buchstabe kleiner alsc
, und 1! = 1 Permutationen beginnend mitdab
, für eine Gesamtmenge von 1 permutation.Also insgesamt gibt es 19 Permutationen kleiner als
dacb
. Lassen Sie uns überprüfen.Sieht gut aus. So gibt es 4! − 19 − 1 = 4 die Permutationen, die größer sind als
dacb
.Sollte es nun verständlich sein, wie die Verallgemeinerung der Methode, um ein Algorithmus. Hier ist eine Implementierung in Python:
abdc
= 1,acbd
= 2. Was ist falsch mit, dass?Es ist eine sehr saubere Weg dies zu tun, auf der Grundlage der Faktoren-Anzahl system-und Lehmer-codes. Die Idee ist, weisen Sie einen numerischen code, um jede mögliche permutation kodiert, dass die Reihenfolge, in der die Werte auftreten (die Lehmer-code). Sie können dann konvertieren Sie die Lehmer-code in eine Zahl, bestimmt den index der permutation in der Liste aller Permutationen (diese nutzt das die Fakultät Zahlensystem). Angesichts der index der permutation, dann können Sie berechnen (n! - 1) und subtrahieren aus dem index, um zu bestimmen, wie viele Permutationen gibt es.
Wenn du neugierig bist, wie Sie dies tun, ich habe eine Implementierung dieses Algorithmus können Sie die Karte von Permutationen der Indizes oder vice-versa. Ich gab auch ein sprechen, wie dies zu tun; die details sind in der zweiten Hälfte der Folien.
Hoffe, das hilft!
Hier ist die Backtracking-Lösung:
Programm permutates alle Lösungen für die gegebene Zeichenkette und gibt es eine Liste von Lösungen, sowie wie viele hier sind.
Ex:
für
acb
es gibt:Code:
Straight-forward-python-Lösung stützt sich auf die Tatsache, dass Pythons permutation generator erzeugt in lexikographischer Reihenfolge aus einer ersten string sortiert.
lexigreaterperms(range(20))
?list
sorgt dafür, dass exponentiellen Speicherplatz benötigt wird, auch.