Ich besuche ein altes Problem, an dem ich vor einiger Zeit gearbeitet habe.
Ein typisches Szenario ist "3 Bits werden innerhalb einer 8-Bit-Ganzzahl gesetzt", dh 00000111.
Alle eindeutigen Kombinationen mit 3 gesetzten Bits können leicht (in der Reihenfolge) durch verschachtelte Schleifen erzeugt werden. Was mich interessiert, ist die Mapping-Index-Kombination <->, dh "00001011" wäre die zweite Kombination (oder der Wert "1" in einem auf Null basierenden Index).
Bisher habe ich alle Kombinationen durchgearbeitet und in einer Tabelle gespeichert, sodass der Suchindex -> Konversation eine O (1) -Operation ist. Die andere Richtung ist O (ln (n)) mit Halbierungssuche.
Der Nachteil ist jedoch, dass dies offensichtlich den Speicher stark belastet, wenn wir die Domain bis zu einem Punkt vergrößern, an dem dies nicht mehr möglich ist.
Was wäre eine einfache Methode, um die n-te Kombination oder den Index für eine bestimmte Kombination zu berechnen? Die Reihenfolge der Kombinationen wäre schön, ist aber nicht obligatorisch.
Antworten:
Das Erzeugen der n-ten Kombination wird als "unranking" -Algorithmus bezeichnet. Beachten Sie, dass Permutationen und Kombinationen häufig durch die Parametrisierung des Problems gleichgesetzt werden können. Ohne genau zu wissen, was das Problem ist, ist es schwierig, den genau richtigen Ansatz zu empfehlen, und tatsächlich sind für die meisten kombinatorischen Probleme normalerweise mehrere unterschiedliche Ranking- / Unranging-Algorithmen möglich.
Eine gute Ressource sind "Combinatorial Algorithms" von Kreher und Stinson. Dieses Buch hat viele gute Ranking- und Unranking-Algorithmen, die klar erklärt wurden. Es gibt fortgeschrittenere Ressourcen, aber ich würde Kreher als Ausgangspunkt empfehlen. Betrachten Sie als Beispiel für einen Algorithmus ohne Rangfolge Folgendes:
Dies ist eine Permutation ohne Rangfolge. Wie oben erwähnt, können Sie in vielen Fällen eine Kombination ohne Rangfolge in ein äquivalentes Permutationsproblem umwandeln.
quelle