Algoritmų sudėtingumas

Iš testwiki.
Pereiti į navigaciją Jump to search

Sudėtingumo teorija – informatikos šaka, nagrinėjanti įvairias algoritmų savybes, dažnai jų įvykdymo greitį. Teorija atsako į klausimą kaip palyginti skirtingus algoritmus sprendžiančius tą pačią užduotį (dažniausiai svarbu yra algoritmo veikimo laikas, bet taip pat nagrinėjama kiek algoritmas sunaudoja atminties, ar jis apskritai baigia darbą, ar galima jį vykdyti lygiagrečiai su keliais kompiuteriais), bei kurie algoritmai yra geriausi.

Pagrindiniai algoritmo sudėtingumo kriterijai: trukmė ir sintaksinis algoritmo aprašymas.[1] Algoritmų sudėtingumą galima tirti šiais būdais:

Algoritmų laiko sudėtingumas

Laiko sudėtingumo skaičiavimas vertina, kiek laiko reiktų tam tikrai problemai su tam tikru duomenų dydžiu spręsti efektyviausiu algoritmu. Tarkime, kad turint n bitų duomenų kiekį, problema išsprendžiama per žingsnių; tokia problema yra sudėtingumo. Iš tiesų, kiekvienas algoritmo įgyvendinimas spręstų problemą skirtingu žingsnių skaičiumi, todėl sąlyginis žingsnių skaičius (eilė) žymima O(n²).

Asimptotinis žymėjimas

O žymėjimas
Asimptotiškai „viršutinė“ riba.
  • Apibrėžtis:f(n)=O(g(n)) jei egzistuoja konstantos c ir n0 tokios, kad cg(n)f(n) visiems nn0.

O dažniausia naudojamas algoritmo blogiausiam atvejui apibūdinti.

Ω žymėjimas
Asimptotiškai „apatinė“ riba.
  • Apibrėžtis:f(n)=Ω(g(n)) jei egzistuoja konstantos c ir n0 tokios, kad cg(n)f(n) visiems nn0.

Ω dažniausia apibūdina algoritmo geriausią atvejį arba apatinę ribą.

Θ žymėjimas
Asimptotiškai „ankšta“ riba.
  • Apibrėžtis:f(n)=Θ(g(n)) jei egzistuoja konstantos c1,c2 ir n0, tokios, kad c1g(n)f(n)c2g(n) visiems nn0.

Asimptotiškai „ankštai“ ribai taip pat galioja savybė, f(n)=Θ(g(n))f(n)=O(g(n))f(n)=Ω(g(n)). Asimtotiškai „viršutinė“ riba O(g(n)) dažnai yra neteisingai naudojama ankštai ribai Θ(g(n)) apibrėžti, kuri nepadengia Ω(g(n)) atvejo.

o žymėjimas
Asimptotiškai „negriežta viršutinė“ riba.
  • Apibrėžtis:f(n)=o(g(n)) jei limn(f(n)/g(n))=0.
ω žymėjimas
Asimptotiškai „negriežta apatinė“ riba.
  • Apibrėžtis:f(n)=ω(g(n)) jei limn(f(n)/g(n))=, t. y., g(n)=o(f(n)).

Žymėjimo ypatumai

Žymėjimas f(n)=O(g(n)), kai vietoj O gali būti O,o,Θ,Ω,ω yra konceptualiai klaidingas, tačiau yra plačiai naudojamas analizuojant algorithmų sudėtingumą. Korektiškumo dėlei reikėtų vartoti f(n)O(g(n))

O žymėjimai

Dažniausi algoritmų sudėtingumo žymėjimai ir jų pavadinimai:

Žymėjimas Sudėtingumas Klasė
O(1) konstantinis Polinominė (P)
O(logn) logaritminis
O([logn]c) polilogaritminis
O(n) tiesinis
O(nlogn) supratiesinis
O(n2) kvadratinis
O(nc) polinominis, kartais geometrinis
O(cn) eksponentinis Eksponentinė (NP)
O(n!) faktorialas
O(nn) ?

Pavyzdžiai

Paprasčiausių algoritmų sudėtingumo pavyzdžiai:

Šaltiniai

Šablonas:Išnašos

Šablonas:Informatika