Tło: Chao Xu opublikował kiedyś pytanie: „ Czy są znane algorytmy sortowania porównawczego, które nie ograniczają się do sieci sortujących, tak że każdy element jest porównywany razy? ”. Wygląda na to, że trochę utknęliśmy w tym problemie; Omówiłem ten sam problem z Valentinem Polczukiem w 2009 roku i nigdzie nie doszło.
Aby uzyskać świeże pomysły, próbowałem znaleźć najprostsze możliwe pytanie, które ma podobny smak i nie jest całkowicie trywialne. Stąd następujące pytanie.
Pytanie: Otrzymujesz dwie posortowane listy, z których każda zawiera elementów. Czy możesz scalić listy, aby każdy element był porównywany tylko razy?
Naturalnie, wynik powinien być posortowaną listą zawierającą wszystkie elementy .
[Okazało się to trywialne, odpowiedź brzmi „nie”.]
Pytanie 2: Otrzymujesz dwie posortowane listy, z których każda zawiera elementów. Czy możesz scalić listy, aby każdy element był porównywany tylko razy, jeśli możesz odrzucić niewielką część elementów ?
Dokładniej, wynik powinien być posortowaną listą zawierającą elementy oraz „kosz na śmieci” zawierający elementy . Jak małe możesz zrobić wartość ? Uzyskanie jest banalne. Coś w rodzaju powinno być wykonalne w prosty sposób. Ale czy możesz uzyskać ?T ( n ) T ( n ) T ( n ) = n T ( n ) = n / 100 T ( n ) = o ( n )
Uwagi:
Używamy tutaj modelu porównawczego. Tylko algorytmy deterministyczne, interesują nas gwarancje najgorszego przypadku.
Zauważ, że obie listy zawierają dokładnie elementów. Gdybyśmy mieli jedną listę z elementami, a drugą z elementem, odpowiedź brzmi „nie”; Jeśli jednak obie listy są długie, wydaje się, że można wykonać „równoważenie obciążenia”.n 1
Tym razem dowolny algorytm jest poprawny. Jeśli twój algorytm używa sieci sortujących jako elementu składowego, jest w porządku.
Na początek, oto prosty algorytm, który porównuje każdy element maksymalnie 200 razy: Po prostu użyj standardowego algorytmu scalania, ale zachowaj liczniki dla nagłówków list. Gdy osiągniesz 200, odrzuć element. Teraz dla każdego odrzucanego elementu z powodzeniem umieściłeś 200 elementów w tablicy wyjściowej. Dlatego osiągnąłeś .