2013-09-26 11 views
7

Obecnie studiuję podstawowe algorytmy dla Big Oh. Zastanawiam się, czy ktokolwiek może mi pokazać, jaki kod (n log n) w Javie używałby Big Oh, lub przekierować mnie na dowolną stronę SO, na której istnieje.Big Oh for (n log n)

Ponieważ jestem dopiero początkującym, mogę sobie tylko wyobrazić kod, zanim go napiszę. Teoretycznie (przynajmniej) powinien zawierać jedną pętlę for, w której mamy coś n razy. Następnie dla dziennika n możemy użyć pętli while. Tak więc pętla jest wykonywana n razy, a pętla while jest wykonywana 2 razy w logu. Przynajmniej tak to sobie wyobrażam w głowie, ale zobaczenie kodu wyjaśni sprawę.

+0

Nie jestem pewien, czy rozumiem cię poprawnie. Czy pytasz o przykład algorytmu ze złożonością czasu w O (n log n)? – Carsten

+0

Spróbuj zbadać każdy dobry algorytm sortowania, taki jak sortowanie scalone. Poniższy link może Ci pomóc http://stackoverflow.com/questions/1592649/examples-of-algorithms-which-h1-o1-on-log-n-and-olog-n-complexities –

+0

Tak. Chcę tylko zobaczyć, jak będzie wyglądał kod w programie Java. –

Odpowiedz

1

http://en.wikipedia.org/wiki/Heapsort

Prostym przykładem jest właśnie tak, jak to opisano - wykonywać n razy jakieś działanie, które ma log (n). Zrównoważone drzewa binarne mają wysokość log (n), więc niektóre algorytmy drzewa będą miały taką złożoność.

28
int n = 100 
for(int i = 0; i < n; i++) //this loop is executed n times, so O(n) 
{ 
    for(int j = n; j > 0; j/=2) //this loop is executed O(log n) times 
    { 

    } 
} 

Objaśnienie: Zewnętrzna pętla powinna być wolna. Jest wykonywany n razy. Teraz do wewnętrznej pętli. W wewnętrznej pętli po prostu wziąć n i zawsze podzielić go przez 2. więc zadaj sobie pytanie: Ile razy mogę podzielić n przez 2.

Okazuje się, że jest to O (log n). (w rzeczywistości podstawą logu jest 2, ale w notacji Big-Oh opuszczamy bazę, ponieważ dodaje ona tylko niektóre czynniki do naszego logu, który nas nie interesuje).

Wykonuje się pętlę n razy iw tej pętli wykonuje się kolejną pętlę log(n) razy, więc masz O(n) * O(log n) = O(n log n).

+3

To byłoby O (n log n), ale nie jest to realistyczne. Prawie wszystkie * wszystkie algorytmy O (n log n) są rekurencyjne. Być może mógłbyś zaoferować bardziej typową formę. –

+4

Ten przykład miał na celu dostarczyć bardzo prostego przykładu na temat O (n log n). Nie zobaczysz tego algorytmu w rzeczywistości. Tak, te algorytmy są rekurencyjne, ale wyjaśnienie iteracji O (n log n) jest łatwiejsze do zrozumienia. Kluczem jest przekonanie, że zawsze dzielisz n przez dwa. Jest to kluczowa cecha większości algorytmów, takich jak Mergesort, gdzie nazywamy ten sam algorytm dla każdej połowy. Myślałem, że to będzie odpowiednie, ponieważ mówi o zagnieżdżonych pętlach w swoim pytaniu. – slashburn

+1

@slashburn dzięki, to najprostsze wyjaśnienie ..! – TheFlash

2

Algorytmy o złożoności O(.) obejmującej zwykle log n zwykle obejmują jakąś formę dzielenia i zdobywania.

Na przykład, wlista jest o połowę mniejsza, każda część jest indywidualnie sortowana, a następnie dwie połówki są łączone razem. Każda lista jest o połowę.

Ilekroć praca ma być zmniejszona o połowę lub zmniejszony o jakiś stały współczynnik, zazwyczaj kończy się na składniku log n z O(.).

Pod względem kodu, spójrz na algorytm MergeSort. Ważną cechą typowych implementacji jest to, że jest rekursywna (zauważ, że TopDownSplitMerge wywołuje się dwukrotnie w kodzie podanym w Wikipedii).

Wszystkie dobre standardowe algorytmy sortowania mają złożoność czasową i nie można tego zrobić lepiej w najgorszym przypadku, patrz Comparison Sort.

Aby zobaczyć, jak to wygląda w kodzie Java, wystarczy search! Here's one example.