Rozwiązywanie relacji cykliczności za pomocą dwóch wywołań rekurencyjnych


10

Studiuję najgorszy czas wykonywania Quicksort pod warunkiem, że nigdy nie zrobi bardzo niezrównoważonej partycji dla różnych definicji bardzo .

Aby to zrobić, zadaję sobie pytanie, jaki byłby czas działania w przypadku, gdy Quicksort zawsze zdarza się podzielić na ułamek taki, że Elementy znajdują się w lewej przegrodzie, a znajdują się w prawej przegrodzie (pozostawiając element, oś obrotu, pośrodku).T(n,p)0<p≤12⌊p(n−1)⌋⌈(1−p)(n−1)⌉1

Nie powinno być trudno zauważyć, że daje górną granicę w najgorszym przypadku, gdy jest maksymalnie niezrównoważoną dozwoloną partycją, ponieważ każda partycja z ułamkiem będzie bardziej zrównoważona i będzie miała krótszy czas działania, oraz jakakolwiek frakcja jest niedozwolona.T(n,p)p>p<p

Oczywiste jest, że jest najlepszym przypadkiem, a jest najgorszym przypadkiem szybkiego sortowania. Oba mają łatwe relacje nawrotów, które można znaleźć w dowolnym zasobie edukacyjnym. Ale nie mam pojęcia, jak badać w ogóle. Oczywista relacja wyglądałaby następująco:T(n,12)T(n,0)T(n,p)

T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)

Utknąłem. Próbowałem szukać, ale cała literatura, którą mogłem zrozumieć na temat algorytmów dzielenia i zdobywania, zawierała „podział” dosłownie i „oszukiwała” analizę, wykorzystując fakt, że partycje są zawsze równej wielkości, łącząc terminy w jeden raz stały.

Nie wiem, jak poradzić sobie z dwoma połączeniami rekurencyjnymi i nie wiem, czy usunięcie zaokrąglenia jest bezpieczne. Czy można to rozwiązać analitycznie, a jeśli tak, to w jaki sposób?

PS: Nie interesują mnie asymptotyki (które można łatwo pokazać dla dowolnej stałej ). Interesuje mnie, o ile wolniejsze jest szybkie sortowanie, gdy maleje, na przykład interesuje mnie stosunek .Θ(nlog⁡n)ppT(n,0.25)T(n,0.5)

PPS: Jako student studiów przepraszam, że uczyniłem oczywiste rzeczy zbyt długimi lub niewyjaśnionymi nietrywialnościami. I choć nie wiem, czy jest to tak bardzo zaniedbywane, jak inne witryny SE, zauważę, że jest to osobisty interes, a nie praca domowa.

Odpowiedzi:


9

Jak wspomniałeś, twierdzenie Akra – Bazzi pokazuje, że rozwiązaniem rekurencji jest dla wszystkich . Nie ujawnia to jednak charakteru zależności od . Aby ustalić to drugie, możemy zastosować podejście drzewa rekurencyjnego.T(n,p)O(nlog⁡n)p∈(0,1)p

W katalogu głównym drzewa rekurencji jest interwał . Jego dwoje potomków to przedziały i , których łączna długość wynosi ponownie . Każdy z tych węzłów ma dwoje dzieci (zakładając, że jest wystarczająco duży) i tak dalej. Dla uproszczenia ignorujemy błędy zaokrąglania, tzn. Zakładamy, że jest liczbą całkowitą; to tylko technika i nie martwiłbym się tym. Zatrzymujemy proces za każdym razem, gdy węzeł ma długość co najwyżej . Złożoność algorytmu jest proporcjonalna do całkowitej długości interwałów w drzewie. Kiedy , liście{1,…n}{1,…,pn}{pn+1,…,n}nnpn1p≠1/2 (węzły, na których zatrzymujemy proces) mają różną głębokość, co utrudnia określenie ogólnej złożoności.

Możemy uzyskać prostą górną granicę, zauważając, że drzewo ma co najwyżej poziomy: każdy węzeł jest co najmniej mniejszy niż jego rodzic. Podobnie jak w analizie dla , całkowita długość przedziałów na dowolnym poziomie wynosi co najwyżej , i otrzymujemy górną granicę na czas trwania. Ponieważ i dla małego , możemy to zapisać jako .log1−p⁡(1/n)1−pp=1/2nO(nlog1−p⁡(1/n))log1−p⁡(1/n)=log⁡n/log⁡(1−p)−1log⁡(1−p)−1=−log⁡(1−p)=p±O(p2)pO(nlog⁡n/p)

Oto dokładniejsze obliczenia. Rozważ poziom . Załóżmy, że nie zatrzymamy procesu po osiągnięciu krótkiego odstępu czasu. Możemy wygenerować losowy wierzchołek, wykonując kroków, w każdym z których idziemy w lewo (powiedzmy) z prawdopodobieństwem i w prawo (powiedzmy) z prawdopodobieństwem . Za każdym razem, gdy wykonujemy lewy krok, dziennik długości interwału zmniejsza się o , a za każdym razem, gdy robimy prawy krok, zmniejsza się o . Wierzchołek znajduje się w rzeczywistym drzewie dziennika o długości zmniejszonej maksymalnie o . Łączna waga interwałów na poziomiettp1−p−log⁡p−log⁡(1−p)log⁡ntdrzewa jest dokładnie prawdopodobieństwem, że wierzchołek wygenerowany zgodnie z tym procesem odpowiada co najwyżej zmniejszeniu . Oznacza to, że jeśli jest rozkładem równym z prawdopodobieństwem oraz z prawdopodobieństwem , a są niezależne, to całkowita waga poziomu wynosi . Dla superstałej zmienna losowa jest z grubsza normalnie rozkładana ze średnią wariancją liniowąlog⁡nD−log⁡pp−log⁡(1−p)1−pX1,…,Xt∼DtPr[X1+⋯+Xt≤log⁡n]tX1+⋯+Xt[−plog⁡p−(1−p)log⁡(1−p)]tt, więc dla spełniającego , powiedzmy, prawdopodobieństwo będzie bardzo bliskie , podczas gdy dla spełnianie , powiedzmy, będzie bardzo bliskie zeru. Definiując (znany jako binarna funkcja entropii), dochodzimy do wniosku, że czas działania to (jednolite w , jak ). Jako mamy , więc nasze wcześniejsze oszacowanie nie było ścisłe.t[−plog⁡p−(1−p)log⁡(1−p)]t≤(log⁡n)/21t[−plog⁡p−(1−p)log⁡(1−p)]t≥2log⁡nh(p)=−plog⁡p−(1−p)log⁡(1−p)Θ(nlog⁡n/h(p))pn→∞p→0h(p)≈−plog⁡p

Innym sposobem spojrzenia na tę samą analizę jest posiadanie nieskończonej sekwencji niezależnych zmiennych losowych jak poprzednio i zdefiniowanie czasu zatrzymania jako pierwszego tak aby . Czas działania jest wówczas proporcjonalny do . Twierdzenie o elementarnym odnowieniu stwierdza następnie, że , co oznacza, że całkowity rozmiar przedziałów wynosi . Dokładniej, dla każdej stałej całkowity rozmiar przedziałów wynosi , gdzieX1,X2,…TtX1+⋯+Xt≥log⁡nnE[T]limn→∞E[T]/log⁡n=1/E[D]=1/h(p)(1+o(1))nlog⁡n/h(p)p(1+αp(n))nlog⁡n/h(p)αp(n)=o(n) . Konwergencja w elementarnym twierdzeniu o odnowieniu jest wykładnicza w parametrze czasu - w naszym przypadku - więc powinna być wielomianowa w , to znaczy . Prawdopodobnie zbieżność jest również jednolita dla dla dowolnego .log⁡nnαp(n)=O(n−Cp)p∈(δ,1−δ)δ>0


Podsumowując, całkowita długość przedziałów w drzewie rekurencyjnym, która jest proporcjonalna do czasu działania, ma następującą postać dla każdego : gdzie i są przenoszone do tej samej bazy, a jest funkcją zależną od i zmierzającą do pomocą .p

T(n,p)=(1+o(1))nlog⁡nh(p),
log⁡nh(p)=−plog⁡p−(1−p)log⁡(1−p)o(1)p0n

Co więcej, prawdopodobnie prawdą jest, że dla dowolnego i dowolnego prawdą jest, że całkowita długość przedziałów ma postać gdzie i ukryta duża stała O zależą tylko od . W szczególności powinno być tak, że dla wszystkich stałych , a konwergencja jest wielomianowo szybka.δ>0p∈(δ,1−δ)

T(n,p)=(1+O(n−Cδ))nlog⁡nh(p),
Cδ>0δp1,p2
limn→∞T(n,p1)T(n,p2)=h(p2)h(p1),

Dziękuję za szybką odpowiedź Yuval. Jestem trochę zdezorientowany faktem, że użyłeś w swoim podsumowaniu. jest stałą i czy to nie znaczy, że nie ma znaczenia w ? Postanowiłem napisać mały program testowy , który pokazał, że dla porównanie między metodą analityczną a obliczeniową dało błąd 0,03. To wydaje się dość duże, czy można się tego spodziewać? Θh(p)Θn=100000000000000T(n,0.1)/T(n,0.5)
— lub

Stała w jest jednolita w . Dokładniej, dla niektórych stałych jest przypadek, że dla każdego istnieje tak że dla , . Prawdopodobnie można uzyskać jeszcze silniejsze wyrażenie w postaci dla każdego stałego , gdzie małe o jest w odniesieniu do ( ale może zależeć od ); nie powinno zależeć od . Θpc,CpNpn≥Npcnlog⁡n/h(p)≤T(n,p)≤Cnlog⁡n/h(p)T(n,p)=(1+o(1))Cnlog⁡n/h(p)pnpCp
— Yuval Filmus

Konwergencja do limitu zależy od , więc może być konieczne aby był duży, aby uzyskać naprawdę dobre przybliżenie. Z drugiej strony błąd względny 0,03 nie wydaje się tak duży. Możesz spróbować naprawić i wykreślić czas działania jako funkcję , porównując go do . log⁡nlog⁡nnp1/h(p)
— Yuval Filmus

Och przepraszam, nie miałem na myśli błędu względnego 0,03, ale absolutnego (2.13222 vs. 2.10339). Wykreślenie w funkcji , w stosunku do dało względną różnicę 4%, przy czym stanowi 96% . T(n,p)p1/h(p)T(1011,0.05)∗h(0.05)T(1011,0.4)∗h(0.4)
— orlp

1
Superstała jest funkcją zmierzającą do nieskończoności w odniesieniu do odpowiedniej zmiennej (w tym przypadku ). Jest taki sam jak . nω(1)
— Yuval Filmus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.