2012-12-23 9 views
24

Autor opisuje algorytm o nazwie Frog Sort, służący do sortowania listy liczb naturalnych. Algorytm jest opisany w komiksie, ale dla uproszczenia przedrukowałem go tutaj:Czy analiza FrogSort w sobotnim śniadaniu Morning Breakfast jest poprawna?

  1. Dla każdej z sortowanych liczb naturalnych należy utworzyć skrzynkę z wieloma muchami.
  2. Umieść żabę w każdym pudełku.
  3. Chociaż nie wszystkie żaby skoczyły z ich skrzynek jeszcze:
    1. czekać na żaba wyskoczyć z pudełka.
    2. Zapisz liczbę muchów oryginalnie umieszczonych w pudełku.
  4. Wynikowa sekwencja liczb jest oryginalną listą liczb, ale w porządku posortowanym.

Algorytm ten zakłada założenie, że wszystkie żaby jedzą muchy w tym samym tempie. W rezultacie pierwszą żabą, która wyskoczy z pudełka, będzie żaba, która ma najmniejszą liczbę much do każdej, druga żaba druga największa liczba much do zjedzenia itp.

W środku komiks, nauczyciel pyta uczniów "Jaka jest maksymalna liczba kroków?", co interpretuję jako "jaka jest maksymalna liczba kroków wymaganych do zakończenia tego algorytmu?" to jest, co jest runtime algorytmu? Uczeń następnie odpowiada "log żaba (pudełka)."

Czy to dokładna analiza czasu wykonywania tego algorytmu? Czy autor jest zły?

Odpowiedz

12

Ta analiza środowiska wykonawczego jest wyraźnie błędna; możemy uzyskać trywialne Ω runtime z max(n_elements, largest_element) (od kiedy stworzyliśmy skrzynki n_elements, a następnie każde pole zajmuje tyle samo czasu, ile wynosi jego zawartość). Algorytm sortowania, który zajął mniej niż n czasu, byłby ... bardzo zaskakujący.

Jeśli chcesz znaleźć gdzieś więcej analiz w Internecie, ten algorytm jest odpowiednikiem funkcji sleep-sort.W przypadku, gdy nie jesteś zaznajomiony z tym algorytmem śmieszne, to jest tutaj w bash:

#!/bin/bash 

function sort() { 
    for num in "[email protected]" ; do 
     (
     sleep $num 
     echo $num 
     ) & 
    done 
    wait 
} 

sort 6 1 3 4 
+0

Jeśli masz duży stopień paralelizmu, pobudzenie O (n) do sortowania może być teoretycznie możliwe dzięki Sortowanie snu – templatetypedef

+0

W szczególności: Ponieważ sieci sortujące (http: //en.wikipedia .org/wiki/Sorting_network) istnieją z głębokością O (log n), powinno być możliwe sortowanie n liczb w czasie O (log n), jeśli masz n procesorów wszystkich działa równolegle. – templatetypedef

+0

Sortowanie snu także przyszło mi do głowy, kiedy czytałem historię. +1 –

5

Jestem dość pewny, że autor komiksu jest w błędzie. Poniżej znajduje się bardziej formalna analiza algorytmu.

Na początek będziemy musieli ustalić podstawowe zasady dotyczące tego, jak żaby jedzą muchy. Zakładam, że wszystkie żaby mogą jeść muchy w stałym tempie r. Oznacza to, że żaba potrzebuje sekund, aby zjeść jedną muchę, 10 sekund dla żaby, aby zjeść dziesięć much itp. Następnie, zróbmy (rozsądne) założenie, że wszystkie żaby jedzą równolegle. Przyjmiemy również, że potrzeba czasu j, aby żaba wyskoczyła z pustego pudełka.

Musimy również uwzględnić czas konfiguracji. Załóżmy, że mamy pod ręką nieograniczony zapas much, żab i pudełek, i powiedzmy, że potrzeba czasu b, aby uzyskać pudełko i czas na włożenie jednej muchy do pudełka. Na koniec zakładamy, że potrzeba czasu na umieszczenie żaby w pudełku. Dla uproszczenia przyjmiemy, że żaby nie zaczynają jeść much, dopóki wyraźnie tego nie zalecimy, aby żaby umieszczone w pudełkach przed innymi żabami nie stały się strzałem w dziesiątkę.

Jeden ostatni szczegół - załóżmy, że potrzeba czasu na zapisanie numeru.

W tym przypadku środowisko wykonawcze tego algorytmu jest podane w następujący sposób. Przypuśćmy, że nasza lista numerów do sortowania to x , x , ..., x n. W takim przypadku ilość czasu potrzebna do skonfigurowania wszystkich skrzynek będzie wynosić n (b + f) + y (Σ x i). Powodem tego jest to, że musimy uzyskać n boksów i umieścić jedną żabę w każdym pudełku (stąd pierwszy termin) plus jednostki czasu dla każdej z much (stąd drugi termin).

W ramach algorytmu, musimy zapisać każdy numer dokładnie raz, gdy żaba wyskakuje z pudełka. Oznacza to, że w całym algorytmie wykonamy pracę zapisując posortowaną sekwencję.

Wreszcie, musimy zastanowić się, jak długo trwają wszystkie żaby. Ponieważ wszystkie żaby jedzą równolegle, wszystko, co musimy zadbać, to żaba, która ma najwięcej much do zjedzenia. Ta żaba będzie miała muchy do zjedzenia, gdzie x maks. jest maksymalną liczbą na liście wejściowej. Dlatego czas spędzany przez żaby na robienie jedzenia jest określony przez r x max. Factoring w skoku podjętym przez ostatnią żabę, wszystkie żaby pracują równolegle, będą wspólnie kończyć w rx max + j czas.

Oznacza to, że całkowity czas dla algorytmu jest przez

n (f + b) + Y Σ x i + NW + RX maks + J.

Jeśli teraz przyjmiemy, że "jedna jednostka pracy" wystarczy, aby wykonać jedną z indywidualnych operacji (żaba może zjeść muchę, wyskoczyć z pudełka lub umieścić żabę w pudełku, itd.), przy czym całkowity czas wymagany jest co najwyżej

n + Σ (x i) + x maks + 1

Stwierdzając, że x maks ≤ Σ x i, otrzymujemy, że całkowity czas pracy tego algorytmu jest Θ (n + Σ x i). Innymi słowy, środowisko wykonawcze jest proporcjonalne zarówno do liczby liczb do posortowania, jak i całkowitego rozmiaru sortowanych liczb.

Zauważ, że to środowisko wykonawcze nie ma żadnych logarytmy w nim, więc od razu możemy stwierdzić, że analiza Runtime autora jest błędna.

Na koniec zauważ, że jest to naprawdę zły algorytm sortowania. Algorytm counting sort może sortować n liczb naturalnych w czasie O (n + U), gdzie U jest maksymalną wartością do posortowania, która jest asymptotycznie lepsza niż FrogSort. Algorytm radix sort mógłby to zrobić w czasie O (n lg U), który jest lepszy dla dużych wartości U. Potem znowu oba algorytmy wymagają wyrafinowanych mechanizmów, które prawdopodobnie nie istniałyby w otoczeniu opisanym przez komiks.

Mam nadzieję, że to pomoże!

+0

Kolejnym założeniem jest to, że żaby są głodne i jedzą co najmniej n leci bez zatrzymywania się na stopie r, dla dowolnej użytecznej wartości n. – arikb

0

To nie jest odpowiedź, ale sam Zach dostał kopa z tego. To część wielkanocnego jajka w ezoterycznym języku programowania mózgu, http://esolangs.org/wiki/Cbrain. Pochodna bf skompilowana z OpenCOBOL. Aby być spoza żaby, wartość warunkową można ustawić na wartość 2 zamiast 1. frogSort w języku COBOL.

 *> ******************************************************** 
     *> frogSort, called for help with 10-94, request for count 
     *> ******************************************************** 
     identification division. 
     program-id. frogsort. 
     data division. 
     working-storage section. 
     01 opinion   usage binary-long. 
     01 shared-value  pic 99. 
      88 fair   value 1. 
     01 caveman-count pic x(12) value "[-]+++++++++". 
     01 spacer   pic x(10) value spaces. 

     linkage section. 
     01 jars. 
      05 flies  pic 9 occurs 21 times. 

     *> ******************************************************** 
     procedure division using jars. 
     start-here. 
     move function length(jars) to shared-value 
     display "Grog sort jars. frogSort" end-display 
     display "http://www.smbc-comics.com/?id=2831" end-display 
     . 

     forkyourself. 
      call "fork" returning opinion end-call 
      if opinion is zero then 
       subtract 1 from shared-value 
       if not fair then go forkyourself. 
     . 

     call "sleep" using by value flies(shared-value) end-call 
     display 
      "Jar: " function char(shared-value + 65) " reporting " 
      caveman-count(1 : flies(shared-value) + 3) " flies," 
      spacer(1 : 10 - flies(shared-value)) 
      "that would be " flies(shared-value) " to you, futureman." 
     end-display 
     call "wait" using by value 0 end-call 

     stop run returning 107. 
     end program frogsort. 

z jajko wyrzucony z nazywają „frogsort” używając „”" END-Call

$ ./cbrainrun 
10-12 Welcome to cbrain v0.42 
cb: 1094 
cb: help 
Grog sort jars. frogSort 
http://www.smbc-comics.com/?id=2831 
Jar: U reporting [-] flies,   that would be 0 to you, futureman. 
Jar: K reporting [-] flies,   that would be 0 to you, futureman. 
Jar: A reporting [-] flies,   that would be 0 to you, futureman. 
Jar: L reporting [-]+ flies,   that would be 1 to you, futureman. 
Jar: B reporting [-]+ flies,   that would be 1 to you, futureman. 
Jar: M reporting [-]++ flies,  that would be 2 to you, futureman. 
Jar: C reporting [-]++ flies,  that would be 2 to you, futureman. 
Jar: N reporting [-]+++ flies,  that would be 3 to you, futureman. 
Jar: D reporting [-]+++ flies,  that would be 3 to you, futureman. 
Jar: O reporting [-]++++ flies,  that would be 4 to you, futureman. 
Jar: E reporting [-]++++ flies,  that would be 4 to you, futureman. 
Jar: P reporting [-]+++++ flies,  that would be 5 to you, futureman. 
Jar: F reporting [-]+++++ flies,  that would be 5 to you, futureman. 
Jar: Q reporting [-]++++++ flies, that would be 6 to you, futureman. 
Jar: G reporting [-]++++++ flies, that would be 6 to you, futureman. 
Jar: R reporting [-]+++++++ flies, that would be 7 to you, futureman. 
Jar: H reporting [-]+++++++ flies, that would be 7 to you, futureman. 
Jar: S reporting [-]++++++++ flies, that would be 8 to you, futureman. 
Jar: I reporting [-]++++++++ flies, that would be 8 to you, futureman. 
Jar: T reporting [-]+++++++++ flies, that would be 9 to you, futureman. 
Jar: J reporting [-]+++++++++ flies, that would be 9 to you, futureman. 
Powiązane problemy