AlgoLab operace, ne sekundy

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Rozděl a panuj: odkud se bere to log n

Kvadratická třídění srovnávají každý prvek skoro s každým. Rychlá třídění dělají něco jiného: rozdělí úlohu na dvě poloviny, vyřeší je zvlášť a výsledky spojí — a to spojení je levné.

Kde se vezme ten logaritmus

Pole o velikosti n se dá půlit log₂ n krát, než zbudou jednotlivé prvky. Na každé úrovni toho půlení se udělá dohromady n práce (každý prvek se dotkne právě jednou), a úrovní je log₂ n:

n prvků na každé z log₂ n úrovní  →  n · log₂ ncelá analýza slučování

Pro n = 1 000 000 je log₂ n asi 20. Kvadratický algoritmus by udělal 5·10¹¹ operací, ten n log n asi 2·10⁷ — rozdíl je faktor 25 000, a to je ten skok, kvůli kterému se ta složitost učí.

Slučování: cena, kterou porovnání neukážou

Sloučit dvě setříděné poloviny je snadné — porovnávají se jejich čela. Jenže výsledek se musí někam zapsat, a to znamená alokovat pole o velikosti n. Je to jediný běžný třídicí algoritmus, který si žádá paměť navíc.

slučovánímquicksort
nejhorší případn log n vždycky
paměť navícnžádná (jen zásobník)
stabilníanone
hloubka rekurzelog nlog n až n

Ta tabulka je celý důvod, proč existují oba. Slučování se používá tam, kde je potřeba záruka (Java pro objekty, protože stabilita je součást specifikace), quicksort tam, kde je paměť pevná a průměr stačí.

V regulační smyčce je alokace problém sama o sobě, i kdyby byla rychlá — protože doba jejího trvání není předvídatelná. Kapitola 11 to rozvádí; zatím stačí, že „n log n“ a „vejde se do smyčky“ jsou dvě nezávislé vlastnosti.

Vzorce v této kapitole

n log n — rozděl a panuj
T(n) = 2T(n/2) + n → n log₂ n [—] kap. 5