Wie kann ich die n-te Permutation berechnen (oder die lexikografische Reihenfolge einer bestimmten Permutation angeben)?
Diese Frage besteht aus zwei Teilen. Da ich jedoch versuche, mit einer Prolog-Implementierung fertig zu werden, führt die Lösung eines Problems wahrscheinlich sofort zu einer Lösung des anderen.
{1,2,...,N}
Wie kann ich bei einer Permutation einer Liste von Ganzzahlen feststellen, wie hoch der Index dieser Permutation in lexikografischer Reihenfolge ist?k
Wie kann ich bei gegebener Zahl diek
-te Permutation von Zahlen berechnen{1,2...,N}
?
Ich suche nach einem Algorithmus, der dies einigermaßen besser kann, als nur eine next permutation
Funktionszeit zu iterieren k
. Afaik sollte es möglich sein, beide direkt zu berechnen.
Was ich mir bisher ausgedacht habe, ist, dass ich anhand der Zahlen von links erkennen kann, wie viele Permutationen vor jeder Zahl in einem bestimmten Index waren, und diese dann irgendwie kombinieren kann, aber ich bin mir nicht sicher, ob dies zu einem führt richtige Lösung.
Ich werde nur den Entwurf einer Lösung für jede geben:
Wie kann ich bei einer Permutation einer Liste von ganzen Zahlen {1,2, ..., N} feststellen, wie hoch der Index dieser Permutation in lexikografischer Reihenfolge ist?
Fragen Sie sich dazu, mit wie vielen Permutationen beginnen 1
? Es gibt (N - 1)!
. Lassen Sie uns nun ein Beispiel machen:
3 1 2
Wie viele Permutationen 1 2 3
beginnen mit 1
oder 2
? 2*2!
. Dieser muss hinter diesen her sein, also ist sein Index mindestens 2*2! = 4
. Überprüfen Sie nun das nächste Element. Mit wie vielen Permutationen 1 2
beginnen Sie 0
? Keiner. Sie sind fertig, der Index ist 4
. Sie können hinzufügen, 1
wenn Sie eine 1
-basierte Indizierung verwenden möchten .
Wie kann ich bei einer gegebenen Zahl k die k-te Permutation von Zahlen {1,2 ..., N} berechnen?
Gegeben 4
, wie wir bekommen können 3 1 2
? Wir müssen jedes Element finden.
Was können wir auf der ersten Position haben? Wenn 1
ja, kann der maximale Index sein 2! - 1 = 1
(ich verwende eine nullbasierte Indizierung). Wenn wir haben 2
, kann das Maximum sein 2*2! - 1 = 3
. Wenn wir haben 3
, kann das Maximum sein 5
. Also müssen wir haben 3
:
3
Nun haben wir das Problem zu finden , die reduzierten 4 - 2*2! = 0
-te Permutation 1 2
, das ist 1 2
(man kann über sie Grund rekursiv wie oben).