Algorytm sortowania par liczb

14

Zadałem już to pytanie przy przepełnieniu stosu , ale może lepiej pasuje do tej witryny.

Problemem jest:

Mam N par liczb całkowitych bez znaku. Muszę je posortować. Wektor końcowy par należy posortować nie malejąco według pierwszej liczby w każdej parze i nieskończenie według drugiej liczby w każdej parze. Każda para może zamieniać pierwszy i drugi element w dowolnym momencie. Czasami nie ma rozwiązania, więc muszę rzucić wyjątek.

Przykład:

in pairs:
1 5
7 1
3 8
5 6

out pairs:
1 7     <-- swapped
1 5     
6 5     <-- swapped
8 3     <-- swapped

^^ Bez zamiany par niemożliwe jest zbudowanie rozwiązania. Zamieniamy więc pary (7, 1), (3, 8) i (5, 6) i budujemy wynik. lub

in pairs:
1 5
6 9

out:
not possible

Dzięki

edytować:

Tom Sirgedas w SO zaproponował najlepsze rozwiązanie . Jest naprawdę łatwy do wdrożenia i działa w O (log (n) * n). Dziękujemy wszystkim za odpowiedzi i zainteresowanie. Naprawdę podobała mi się analiza mjqxxxx.

Klark
źródło
6
Ciekawy problem. Bez zamiany jest to proste, ale przy wymianie nie jest jasne, czy istnieje unikalne rozwiązanie.
Dave Clarke
2
Unikalne rozwiązanie nie zawsze istnieje. Tj. (1, 10), (5, 6). Zarówno (1, 10), (5, 6) i (1, 10), (6, 5) są poprawne.
Klark,
4
Następnym razem dołącz link. stackoverflow.com/questions/5323941/…
Tsuyoshi Ito
2
Jeden z moich znajomych dostał to jako pytanie z wywiadu w formie papierowej. Sądzę więc, że to tylko z ciekawości :)
Klark,
3
(1) Klark, dziękuję za odpowiedź. (2) Nie sądzę, aby to pytanie było pytaniem na poziomie badawczym, ale sądzę, że należy zmienić zakres. Rozpocząłem dyskusję na temat meta .
Tsuyoshi Ito,

Odpowiedzi:

8

p1=(a1,b1)p2=(a2,b2)(a1a2b1b2)(a2a1b2b1)p1p2p1p2p2p1p1p2p1p2p1p2

C1C2p1C1p2C222-kolorowanie, nie ma rozwiązania i możemy zgłosić wyjątek. Jeśli istnieje, zamień wszystkie węzły we wszystkich komponentach jednego koloru. Mamy teraz gwarancję, że dowolne dwa węzły są kompatybilne bez wymiany, dzięki czemu możemy poprawnie sortować listę par przy użyciu zdefiniowanej częściowej kolejności.

O(N2)


AKTUALIZACJA: O wiele bardziej elegancka konstrukcja jest następująca. Jeśli para par nie jest kompatybilna bez wymiany, połącz odpowiednie węzły za pomocą krawędzi (zmuszając je do różnych kolorów w dowolnym kolorze 2). Jeśli para par nie jest kompatybilna z jedną wymianą, połącz odpowiednie węzły łańcuchem o długości 2 (zmuszając je do tego samego koloru w dowolnym kolorze 2). Istnieje rozwiązanie wtedy i tylko wtedy, gdy wynikowy wykres jest dwukolorowy. Aby skonstruować rozwiązanie z niebiesko-czerwonego zabarwienia wykresu, zamień tylko te pary, których odpowiadające węzły są niebieskie, a następnie posortuj wynikową listę.

mjqxxxx
źródło
1
Dziękuję bardzo za odpowiedź. Naprawdę podobało mi się czytanie. Sprawdź odpowiedź zaproponowaną na SO. Chociaż nie opiera się na teorii grafów, co oznacza, że ​​jest mniej interesujący niż twoje eleganckie rozwiązanie :), jest szybszy. Dziękuję za Twój czas.
Klark,
3

Niech X (a, b) oznacza zmienną binarną wskazującą, czy para (a, b) powinna zostać zamieniona. Rozważ dowolną parę odrębnych par (a, b) i (c, d) i napisz binarne ograniczenie na zmienne X (a, b) i X (c, d), które jest spełnione tylko wtedy, gdy obie pary są w prawidłową kolejność po wykonaniu zamiany wskazanej odpowiednio przez X (a, b) i X (c, d). Połączeniem wszystkich takich ograniczeń binarnych jest formuła 2-SAT w n zmiennych i klauzulach O (n ^ 2), która jest zadowalająca tylko wtedy, gdy pierwotny problem ma rozwiązanie. Można to sprawdzić w czasie O (n ^ 2).


Jeśli chodzi o oryginalne rozwiązanie, pamiętaj, że wszystkie ograniczenia mają postać X (a, b) = X (c, d) lub X (a, b)! = X (c, d) (lub X (a, b) = stała), więc działa prosty algorytm „scal i sprawdź dwustronność”:

Zacznij od tego, że każdy X jest reprezentatywny dla zestawu zawierającego tylko siebie; następnie dla każdej pary (X, Y) tak, że X = Y jest ograniczeniem, połącz składniki, do których należą X i Y; i na koniec sprawdź, czy wykres skurczony, w którym każdy element jest jednym wierzchołkiem, a jakaś krawędź łączy elementy zawierające X i Y, jeśli relacja X! = Y musi być zachowana, jest dwustronny.

David
źródło
1
X(a,b)=X(c,d)
Więc? Relacja równoważności jest tutaj przechodnim zamknięciem relacji (a, b) R (c, d) iff a <c i b> d lub odwrotnie. Może nie byłem do końca jednoznaczny, ale z mojej odpowiedzi powinno to wynikać.
David
1
a<cb>dX(a,b)X(c,d)(1,10)(2,5)(3,7)
1
XYX¬Y
1
Żartujesz? Przede wszystkim każdy związek między tylko dwiema zmiennymi można wyrazić jako formułę 2-SAT. Na przykład X = Y jest taki sam jak (X oznacza Y) i (nie X oznacza nie Y). Z drugiej strony, jeśli wszystkie ograniczenia mają rzeczywiście postać X = Y lub X = nie Y, to nie ma potrzeby uruchamiania algorytmu 2SAT: prostszy algorytm „scalania i sprawdzania dwustronności”, który opisałem wcześniej, działa.
David