Powracam do starego problemu, nad którym pracowałem jakiś czas temu.
Typowy scenariusz to „3 bity są ustawione w 8-bitowej liczbie całkowitej”, tj. 00000111.
Wszystkie unikalne kombinacje z 3 bitami zestawu można łatwo wygenerować (w kolejności) za pomocą zagnieżdżonych pętli. Interesuje mnie kombinacja indeksu mapowania <->, tzn. „00001011” byłby drugą kombinacją (lub wartością „1” w indeksie zerowym).
Do tej pory przeglądałem wszystkie kombinacje i zapisywałem je w tabeli, dzięki czemu indeks wyszukiwania -> konwersacja to operacja O (1). Drugi kierunek to O (ln (n)) z wyszukiwaniem dwusiecznym.
Minusem jest jednak to, że to oczywiście obciąża pamięć, jeśli zwiększymy domenę, do tego stopnia, że nie jest to możliwe.
Jaki byłby prosty sposób obliczenia n-tej kombinacji lub indeksu dla danej kombinacji? Kolejność kombinacji byłaby dobra, ale nie jest obowiązkowa.
Odpowiedzi:
Generowanie n-tej kombinacji nazywa się algorytmem „nierankingowym”. Zauważ, że permutacje i kombinacje często można utożsamiać ze sposobem parametryzacji problemu. Nie wiedząc dokładnie, na czym polega problem, trudno jest zalecić dokładne właściwe podejście, aw rzeczywistości w przypadku większości problemów kombinatorycznych zwykle istnieje kilka różnych algorytmów rankingu / nierankingowania.
Jednym z dobrych zasobów są „Algorytmy kombinatoryczne” autorstwa Krehera i Stinsona. Ta książka ma wiele dobrych algorytmów rankingowych i nierankingowych. Istnieją bardziej zaawansowane zasoby, ale polecam Krehera jako punkt wyjścia. Jako przykład algorytmu nierankingowego rozważ następujące kwestie:
Jest to nierankingowa permutacja, ale jak wspomniano powyżej, w wielu przypadkach można przekształcić kombinację nierankingową w równoważny problem permutacyjny.
źródło