Mam zestaw par. Każda para ma taką postać (x, y), że x, y należą do liczb całkowitych z zakresu [0,n)
.
Jeśli więc n wynosi 4, to mam następujące pary:
(0,1) (0,2) (0,3)
(1,2) (1,3)
(2,3)
Mam już pary. Teraz muszę zbudować kombinację za pomocą n/2
par, tak aby żadna liczba całkowita nie była powtarzana (innymi słowy, każda liczba całkowita pojawia się co najmniej raz w ostatecznej kombinacji). Poniżej podano przykłady poprawnej i niepoprawnej kombinacji dla lepszego zrozumienia
1. (0,1)(1,2) [Invalid as 3 does not occur anywhere]
2. (0,2)(1,3) [Correct]
3. (1,3)(0,2) [Same as 2]
Czy ktoś może zasugerować mi sposób na wygenerowanie wszystkich możliwych kombinacji, gdy tylko będę mieć pary.
algorithms
graphics
data-structures
computational-geometry
operating-systems
process-scheduling
algorithms
sorting
database-theory
relational-algebra
finite-model-theory
logic
automata
linear-temporal-logic
buchi-automata
complexity-theory
np-complete
decision-problem
machine-learning
algorithms
pattern-recognition
logic
formal-languages
formal-grammars
context-free
Ankit
źródło
źródło
Odpowiedzi:
Jednym bezpośrednim sposobem jest procedura rekurencyjna, która wykonuje następujące czynności przy każdym wywołaniu. Dane wejściowe do procedury to lista par, które zostały już wybrane, oraz lista wszystkich par.
Sposobem na wizualizację tego algorytmu jest drzewo, którego ścieżki są sekwencjami nienakładających się par. Pierwszy poziom drzewa zawiera wszystkie pary zawierające 0. W powyższym przykładzie drzewo to
W tym przykładzie wszystkie ścieżki przez drzewo faktycznie dają poprawne kolekcje, ale na przykład, jeśli pominiemy parę (1,2), wówczas skrajnie prawa ścieżka będzie miała tylko jeden węzeł i nie powiedzie się wyszukiwanie w kroku 3.
Algorytmy wyszukiwania tego typu można opracować dla wielu podobnych problemów z wyliczaniem wszystkich obiektów określonego typu.
źródło
Możesz wyświetlić listę wszystkich par, dzwoniąc
źródło
Aktualizacja : moja wcześniejsza odpowiedź dotyczyła grafów dwustronnych, o które OP nie pytał. Zostawiam to na razie, jako powiązane informacje. ale bardziej trafne informacje dotyczą idealnych dopasowań w grafach dwudzielnych.
W związku z tym istnieje przyjemna ankieta przeprowadzona przez Propp, która przedstawia postęp (do 1999 r.). Niektóre pomysły zawarte w tym artykule i powiązane linki mogą okazać się przydatne. TL; DR jest - to trudne :)
--- Początek starej odpowiedzi
Zwróć uwagę, że to, o co prosisz, to wyliczyć wszystkie możliwe idealne dopasowania na dwudzielnym wykresie. Istnieje wiele różnych algorytmów do tego, a w szczególności jeden z najnowszych pochodzi z ISAAC 2001 .
Podstawową ideą jest znalezienie jednego idealnego dopasowania za pomocą przepływów sieciowych, a następnie wielokrotne modyfikowanie go za pomocą naprzemiennych cykli (więcej informacji można znaleźć w rozdziale podręcznika na temat algorytmów przepływów sieciowych).
źródło
Każda wybrana para eliminuje dwa rzędy, z których nie można już wybierać. Ten pomysł można wykorzystać do skonfigurowania algorytmu rekurencyjnego (w Scali):
Można to z pewnością wyrazić w bardziej wydajny sposób. W szczególności wezwanie do nie jest używane, aby nie brać pod uwagę całych wierszy dla kombinacji
filter
.źródło
Chociaż istnieje już wiele uroczych odpowiedzi na pytanie, myślę, że fajnie byłoby wskazać na podstawową, ogólną sztuczkę.
Znacznie łatwiej jest generować unikalne kombinacje, jeśli można uzyskać całkowitą kolejność łączonych elementów . W ten sposób wyjątkowość jest gwarantowana, jeśli pozwolimy tylko na posortowane kombinacje. Nie jest też trudno wygenerować posortowane kombinacje - po prostu przeprowadź zwykłe wyszukiwanie wyliczeń siły brutalnej, ale na każdym kroku wybieraj tylko elementy większe niż te już wybrane na każdym kroku.
Dodatkową komplikacją w tym konkretnym problemie jest chęć uzyskania tylko kombinacji długości n / 2 (maksymalna długość). Nie jest to trudne, jeśli zdecydujemy się na dobrą strategię sortowania. Na przykład, jak wskazano w odpowiedzi Carla Mummeta, jeśli weźmiemy pod uwagę rodzaj leksykograficzny (z góry na dół, lewy-prawy na schemacie w pytaniu), otrzymujemy strategię polegającą na tym, aby zawsze przyjmować następny element, tak aby jego pierwszą cyfrą była najmniejsza wciąż nieużywana liczba.
Możemy również rozszerzyć tę strategię, jeśli chcemy generować sekwencje o innych długościach. Pamiętaj tylko, że za każdym razem, gdy wybieramy kolejny element, którego pierwsza liczba nie jest najmniejszą dostępną, wykluczamy pojawienie się jednego lub większej liczby wierszy elementów na posortowanym podsekwencji, więc maksymalna długość wstępnego cięcia odpowiednio się zmniejsza.
źródło
Nie jestem pewien, czy o to pytasz, ale jak rozumiem, masz wszystkie nieuporządkowane pary i chcesz policzyć listę wszystkich par, które obejmuje zestaw gdzie jest liczbą parzystą. Można myśleć o tym, jak krawędź pokryć z kompletna wykresu na wierzchołków.(n2) [n]={1,⋯,n} [n] n Kn n
Ponadto wydaje się, że pytanie zakłada, że każda liczba w pojawia się tylko raz na liście. W takim przypadku patrzymy tylko na pokrycia, które są idealnie dopasowane . Liczba dopasowań na wykresie jest równa stałej jego macierzy przylegania . Musimy więc obliczyć .[n] Perm(Kn)
Wiadomo, że permanent jest , ale tak jest w ogóle. Dla istnieją takich list.#P-complete Kn n!2n2
Najłatwiejszym sposobem wygenerowania tych wszystkich elementów jest poprawienie jednego idealnego dopasowania, a następnie zastosowanie permutacji ale spowoduje to wygenerowanie wielu duplikatów.[n] źródło