Załóżmy, że chcemy posortować listę z liczb rzeczywistych. Załóżmy, że otrzymujemy czarną skrzynkę, która może natychmiast posortować liczb rzeczywistych. Ile korzyści możemy zyskać dzięki tej czarnej skrzynce? √
Na przykład, czy możemy posortować numery za pomocą tylko wywołań do czarnej skrzynki? Najlepszy algorytm, jaki znalazłem, wykorzystuje wywołań do czarnej skrzynki. Ale nie byłem w stanie go jeszcze poprawić. Oto mój algorytm podobny do sortowania według scalenia:n
Najpierw podziel listę na listy o wielkości w przybliżeniu . Następnie użyj wywołań do czarnej skrzynki, aby posortować te listy. Na koniec połącz posortowane listy za pomocą czarnej skrzynki w następujący sposób:√ s1 √
Umieść najmniejsze elementy list na nowej liście , a następnie wywołaj czarną skrzynkę, aby ją posortować. Liczba w (pierwszy i najmniejszy element ) będzie najmniejsza liczba w . Możemy umieścić go na pierwszym miejscu listy wyników.
Zakładając, że element jest wybrany z , zastąpić z drugiej najmniejszej element listy rodzaj i ponownie uruchomić czarna skrzynka na to, aby obliczyć drugą najmniejszą członka .
Kontynuujemy, aż wszystkie elementy zostaną posortowane. Całkowita liczba wywołań czarnej skrzynki dla tej części będzie wynosićL [ 1 ] L S s j L [ 1 ] s j S n - √
. Dlatego ogólnie łączna liczba połączeń wyniesie .
Z drugiej strony wygląda na to, że powinniśmy być w stanie uzyskać dolną granicę za pomocą dolnej granicy na porównaniach liczb potrzebnych do sortowania w następujący sposób: Możemy zaimplementować czarną skrzynkę za pomocą porównań. Jeśli możemy rozwiązać problem z wywołaniami do czarnej skrzynki i scaleniem w czasie liniowym, możemy posortować liczb rzeczywistych z porównaniami co jest niemożliwe.o( √no(nlgn)
Wydaje mi się, że moglibyśmy udowodnić, że jest dolną granicą liczby wywołań do czarnej skrzynki, ponieważ wiele porównań używanych w czarnej skrzynce byłoby współdzielonych i dlatego są one uwzględnione w naszym argumencie.
AKTUALIZACJA: Jak sugerują inne posty, możliwe jest także .
źródło
Odpowiedzi:
Możliwe jest sortowanie za pomocą wywołań do czarnej skrzynki i bez porównań.O ( n--√logn )
Najpierw rozważmy następujący problem zrównoważonego partycjonowania: biorąc pod uwagę elementów (gdzie ), je na dwie grupy, najmniejszy rozmiar co najmniej około , więc że wszystkie elementy w pierwszej grupie są mniejsze niż wszystkie elementy w drugiej grupie. Można to zrobić za pomocą wywołań do czarnej skrzynki. (Opiszę to później.) Następnie użyj szybkiego sortowania z tym algorytmem partycjonowania:A [ 1 .. m ] √m A [ 1 .. m ] m/4O(m/ √n--√≤ m ≤ n m/4 O(m/n−−√)
Zakładając, że każdy krok partycji zabiera wywołania do czarnej skrzynki, powyższy algorytm, podany na wejściu , wykona wywołania do czarnej skrzynki, ponieważ drzewo rekurencji ma głębokość a każdy poziom drzewa ma w sumie wywołań do czarnej skrzynki.A[1 ..n]O( √O(m/n−−√) A[1..n] O(logn)O(n/ √O(n−−√logn) O(logn) O(n/n−−√)=O(n−−√)
Wykonaj krok partycjonowania w następujący sposób:
źródło
Myślę, że twoje pytanie zostało rozwiązane w artykule Beigela i Gilla „ Sortowanie n obiektów za pomocą k-sortera ” z 1990 roku, a streszczenie artykułu mówi wszystko:
źródło
źródło