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.

Změřený růst proti předpovědi

„Tohle je kvadratické“ je tvrzení, které jde ověřit. Stačí spustit algoritmus na několika velikostech, spočítat operace a podívat se, jak ta čísla rostou.

npočet operací proti n, obojí logaritmicky163264128256512změřený sklon1.998to odpovídápři n = 512133 361při n = 16127Sklon se nepředpokládá —proloží se naměřenými body.vkládáním, náhodné — přepni vstup na setříděné a sleduj, které křivky se zlomí.
Obě osy jsou logaritmické, takže mocninná závislost je přímka a její SKLON je ten exponent. Přepni vstup na setříděné pole a sleduj, které křivky se zlomí na přímku se sklonem 1 — a která se nezlomí.

Proč logaritmické osy

Když je počet operací c·n^k, pak po zlogaritmování obou stran vyjde přímka:

log(operace) = k · log(n) + log(c)mocninná závislost je na log-log osách přímka

Sklon té přímky je přímo ten exponent. Konstanta c jen posune přímku nahoru nebo dolů a sklon nezmění — a to je přesně to, co O() zahazuje. Na log-log grafu je tedy vidět obojí naráz: sklon je složitost, výška je konstanta.

Co vyjde

algoritmuszměřený sklonteorie
bublinkové2,01
vkládáním1,96
výběrem1,98
slučováním1,22n log n
quicksort1,23n log n

Ta 1,22 u n log n stojí za vysvětlení, protože vypadá jako nepřesnost a není. n log n není mocninná závislost — na log-log osách to není přímka, jen skoro. Proložený sklon proto vyjde mezi 1 a 2 a pomalu roste s rozsahem n, na kterém se měří. To není chyba měření; je to důkaz, že ta funkce mocninná není.

Nejlepší případ se taky změří

Na už setříděném poli se třídění vkládáním i bublinkové zlomí na lineární — změřený sklon spadne na 1,0. Třídění výběrem ne: to zůstane na 2,0, protože nemá jak poznat, že je hotovo. Prochází celý zbytek pole i tehdy, když je celé setříděné.

To je nejnázornější ukázka toho, že „stejná složitost“ neznamená „stejné chování“. Tři kvadratické algoritmy, a na setříděném vstupu jsou dva z nich lineární a třetí ne.

Vzorce v této kapitole

sklon — exponent z log-log grafu
log C = k·log n + log c [—] kap. 3