Časovna zahtevnost algoritma
Iz E-študij, proste zakladnice študentskega znanja
Časovna zahtevnost algoritma je (poleg preverjanja pravilnosti) najpomembnejši del analize algoritma.
Na zahtevnost vplivajo
- število podatkov
- velikost posameznega podatka
- vrstni red podatkov
- druge lastnosti posameznega podatka
- relacije med posameznimi podatki
Večinoma je preprosto ugotoviti katera lastnost vhodnih podatkov vpliva na časovno zahtevnost, pri bolj zapletenih algoritmih pa je potrebna posebna analiza za določanje ustreznega parametra velikosti podatkov. Temu parametru pravimo velikost problema:
- n
- velikost problema
Ker je časovna zahtevnost algoritma funkcija parametra n, jo označujemo:
- T(n)
- časovna zahtevnost
Pri določanju časovne zahtevnosti lahko iščemo:
- velikostni red funkcije T(n)
- dejanski pričakovani čas izvajanja
Vsebina |
Velikostni red časovne zahtevnosti
Za določitev velikostnega reda lahko čas izvajanja abstrahiramo v enote in namesto merjenja časa predpostavimo, da je čas izvajanja vseh osnovnih operacij enak eni časovni enoti. Ker nas zanima samo velikostni red izvajanja operacij si pomagamo z asimptotičnim zapisom s funkcijami:
O(·)
Za računanje najslabšega možnega primera (worst case scenario).
Če želimo oceniti časovno zahtevnost algoritma v povprečju moramo izračunati matematično upanje.
Ω(·)
Θ(·)
Amortizirana analiza časovne zahtevnosti
Amortizirana analiza je natančnejša analiza, ki omogoča, da dobimo bolj natančno oceno časovne zahtevnosti, ker upoštevamo spreminjanje stanja v abstraktnem podatkovnem tipu. Pri npr. dodajanju elementov v tabelo, se tabela daljša, in je zato preiskovanje takšne tabele vse bolj časovno zahtevno.
Osnovna ideja je vpeljava funkcije, katero imenujemo potencial.

- potencial stanja S
Potencial stanja oceni relativno zapletenost stanja S glede na operacije, katere izvajamo nad abstraktnim podatkovnim tipom.
- potencial
- funkcija ki oceni kompleksnost podatkovne strukture
- m
- število operacij
amortiziran čas i-te operacije
i = 1 ... m
definiramo kot dejanski čas + razliko v potencialu
na koncu nas zanima vsota vseh časov:
potencial moramo vedno izbrati tako, da je potencial na koncu vedno večji ali enak potencialu na začetku, na ta način imamo garantirano da je zgornja razlika negativna ali enaka nič - s tem dobimo zgornjo mejo
algoritem ki prišteva 1 binarnemu števcu
.-k-.
1 0 1 1 0 1 1 1
+1
---------------
1 0 1 1 1 0 0 0
algoritem od desne proti levi spreminja enke v ničle, prvo ničlo pa spremeni v enko
najslabši možni primer: vsi biti so enke
število bitov:
časovna zahtevnost
v polovici primerov bomo samo prvi bit spremenili v 1
v četrtini primerov bomo spremenili drugi bit v 1
najslabši možni primer je samo 1, zato je zgornja meja slaba ocena časovne zahtevnosti
z amortizirano analizo definiramo nek potencial:
- število enic v števcu
zanima nas amortiziran čas:
- ai = ti+1-k
ti = k + 1
k-1
število enic v novem stanju
zaporedje m operacij ima časovno zahtevnost:
v povprečju je ena operacija reda konstante:
posamezna operacija je lahko počasna
Povezave
Ocena dejanskega časa izvajanja
Zanimajo nas dejanske sekunde, ne samo asimptote. Zato so konstante prav tako pomembne.
Ta čas lahko dobimo le tako da ga izmerimo pri različnih velikostih problema.
Dobimo tabelo in graf
- n v relaciji s T(N)
- iz tega želimo dobiti funkcijo, ki bo uporabna za napoved
- zanima nas zgornja meja
Če algoritem poznamo imamo asimptotično oceno (nek O).
Če vemo da ima kvadratično časovno zahtevnost:
- imamo enačbo s 3 neznankami
- potrebujemo tri meritve:
- n_1 - T(n_1)
- n_2 - T(n_2)
- n_3 - T(n_3)
- potrebujemo tri meritve:
Če želimo vedeti ali so konstante a,b,c res (vsaj približno) konstantne naredimo še več meritev in sistem enačb rešujemo z različnimi množicami teh velikosti. Navadno jemljemo zaporedne 3.
Če konstante niso konstante, potem predpostavka funkcije (vse ostalo razen konstant) ni pravilna (lahko raste hitreje, počasneje...)
- Algoritem za katerega ne vemo kakšna časovna funkcija stoji za njim
| n | T(n) | c | e |
|---|---|---|---|
| 5 | 13,8 | ||
| 6 | 83,6 | ||
| 7 | 388,6 | ||
| 8 | 1796,2 | ||
| 9 | 8753,6 | ||
| 10 | 44421,4 |
Rast funkcije očitno ni linearna, zato ne moremo predpostaviti funkcije, ki raste linearno ali počasneje.
Predpostavimo da gre za polinom katerega stopnje še ne vemo.
Predpostavimo, da bo naša funkcija
(člene nižjega reda spustimo)
ocenjujemo po 2 vrstici tabele skupaj:
| c | e |
|---|---|
| 9,88 |
| 9,97 |
| 11,46 |
| 13,45 |
| 15 |
rast je hitrejša od polinomske, najverjetneje eksponentna
za osnovo vzamemo
| c1 | e1 |
|---|---|
| 2,60 |
| 2,22 |
| 2,21 |
| 2,28 |
| 2,34 |
ker nam manjkajo členi nižjega reda konstante niso konstantne, ohranjajo pa velikostni red, zato je hipoteza relativno dobra
Razlike med razredi zahtevnosti
Funkcije, katere pridejo v praksi v poštev za ocenjevanje časovne zahtevnosti:
f(n)
- konstanten algoritem
- raste izredno počasi - najhitrejši algoritmi
- linearna funkcija
- polinomi
- eksponentni algoritmi - najpočasnejši algoritmi
- asimptotične relacije
- od nekega n-ja naprej zagotovo prevlada funkcija ki ima večji eksponent
- polinom prevlada nad logaritmom pri čemer je lahko a poljubno majhen
- ko je n zadosti velik, bo zagotovo eksponentna funkcija prevladala polinomsko funkcijo
- faktoriela prevlada eksponentno funkcijo ker hitreje raste
| f(n) | f(n+1) - f(n) | 10x hitrejši računalnik izračuna problem v času n0 |
| 0 | / |
| |
|
| O(1) |
|
| O(log n) |
|
| O(n) |
|
| |
|
| |
|
| |
|
| |
|
Vsi algoritmi, katerim zahtevnost raste eksponentno, so neuporabni, ker pri reševanju problema večja hitrost računalnika ne pomaga dosti.