Už vieme, že skutočný čas, ktorý program potrebuje, závisí od konkrétneho počítača. Preto si potrebujeme nájsť iný spôsob, ako odhadnúť rýchlosť programu len tak, že sa pozrieme na jeho kód. Ako na to?
Budeme sa pozerať na algoritmus ako na postupnosť krokov. Naším cieľom je odhadnúť, koľko takýchto krokov program potrebuje v závislosti od veľkosti vstupu, ktorý mu dáme. Neznie to zložito, však? A naozaj to nie je také ťažké, ako sa možno na prvý pohľad zdá.
Pozrime sa na príklad. Tu sú tri rôzne programy, ktoré všetky vypočítajú to isté – súčet prvých $n$ čísel:
# Program 1
print(n * (n + 1) // 2)
# Program 2
sucet = 0
for i in range(1, n + 1):
sucet += i
print(sucet)
# Program 3
sucet = 0
for i in range(1, n + 1):
for j in range(i):
sucet += 1
print(sucet)
Intuitívne asi cítiš, ktorý program je najrýchlejší a ktorý najpomalší, však? Vynásobiť dve čísla je určite rýchlejšie ako pridávať jedno číslo k druhému opakovane.
Keď sa pozrieme na programy, vieme ľahko určiť, koľko operácií urobí každý z nich.
n + 1
), jedno násobenie (* n
), a jedno
celočíselné delenie (// 2
). Počet operácií je teda vždy rovnaký (3), nezávisle
od $n$.for j in range(i):
j
bude 0).j
bude 0, 1).j
bude 0, 1, 2).Keďže sčítanie je jednou s elementárnych operácií, zrazu vieme bez ohľadu na rýchlosť počítača povedať, ktorý program je rýchlejší. Jeden totiž urobí oveľa viac sčítaní ako tie ostatné.
Sčítanie je elementárna operácia, čo znamená, že počítaču trvý jej vykonanie krátky a nemenný čas. Aj keď je to možno prekvapivé, počítaču trvá rovnako dlho vypočítať $1+1$ ako $1574123+478413$. (Aspoň pre rozumne veľké čísla)