Õppetund
Teooria — Big-O keerukuse uurija
Big-O on kasvu ülempiir, mitte aja mõõt. Väitmine, et algoritm on O(N²), tähendab, et alates teatud sisendi suurusest jääb selle töö alla fikseeritud N² kordse — see ei ütle midagi sekundite ega üldse midagi väikeste sisendite kohta.
Mida iga sümbol tähendab
N- sisendi suurus — mitu elementi algoritmile antakse. See on ülal määratud arv vahemikus 2 kuni 1 000 000.
f(N)- selle suuruse juures tegelikult tehtud töö, loendatuna sekundite asemel abstraktsetes operatsioonides.
c- konstantne kordaja, mida tähistus tohib varjata. Väide on
f(N) ≤ c·g(N); c võib olla 2 või 2000 ja see on täpselt see info, mille Big-O eirab. n₀- suurus, millest alates piir peab kehtima. Alla
n₀võivad klassid paikneda mis tahes järjekorras, mistõttu ülaltoodud viis arvu väikese N korral kokku koonduvad.
Kust valem tuleb
- Alusta väitest, mida on vaja täpsustada: töö
f(N)ei kasva lõpuks kiiremini kui mingi võrdlusfunktsioong(N). - “Mitte kiiremini” peab taluma konstantset tegurit, sest sisemise tsükli optimeerimine muudab konstanti, mitte kuju. Seega lubame kordajat:
f(N) ≤ c·g(N). - Ja “lõpuks” peab andma andeks väikesed sisendid, kus võib juhtuda mida tahes. Nõua võrratust alles siis, kui
N ≥ n₀. Kokkuvõttes:f(N) = O(g(N))tähendab, et eksisteerivad mingidc > 0jan₀selliselt, etf(N) ≤ c·g(N)igaN ≥ n₀korral.
Kuidas nähtut lugeda
Viis rida kujutavad ühte sisendi suurust viie kasvuklassi kaudu, kus iga konstant on seatud väärtusele 1 — seega on need operatsioonide arvud, mitte täitmisajad. Vaikimisi valitud N = 100 korral näitavad need väärtusi 1, 7, 100, 664 ja 10,000. Logaritm on alusel 2: log₂ 100 ≈ 6.64, mistõttu kuvab O(log N) arvu 7 ja O(N log N) arvu 664, mitte 700.
- Eeldab
- Et üks operatsioon maksab sama palju kui mis tahes teine ning et arv on täpne, mitte mõõdetud. See muudabki võrdluse selgeks ja samavõrra abstraktseks — mälupöörduste mustrid, vahemälu käitumine ja ketas jäävad sellest mudelist välja ning reaalsel riistvaral otsustavad just need tavaliselt, kumb kahest algoritmist võidab.
- Ei kehti, kui
- Piir ei luba midagi allpool
n₀väärtust ning seda saab otse jälgida: seadistaN = 2ja viis klassi näitavad1,1,2,2ja4— peaaegu eristamatud. Tähistuse garanteeritud järjekord ilmneb alles siis, kui N on suur, mistõttu võib väikese konstandigaO(N²)meetod võitaO(N log N)meetodit iga sisendi puhul, mis sul tegelikult ette tuleb.
Ülesanne täielikult lahendatud
-
Koht, kus avaneb kuristik N log N ja N ² vahel 5 sammu
Kui N = 100, näitab paneel väärtust 664 avaldisele N log N ja 10 000 avaldisele N². See on vaid viieteistkordne tegur — vaevalt kuristik, mida keerukusklassidelt oodatakse. Arvuta välja, kus see kuristik tegelikult avaneb.
-
Alusta neist kahest arvust. log₂ 100 on 6,6439, seega N log₂ N on 664 ja N² on 10 000.
-
Nendevaheline suhe ei ole konstantne ja see ongi keerukusklasside kogu mõte. Jagamisel taandub N ühe korra välja, jättes järele N/log N — suuruse, mis kasvab piiramatult, kuid aeglaselt.
-
Kui N = 100, on see 15,1. See on reaalne, kuid mitte avaldav: viieteistkordne kiirendus on sellist liiki asi, mille võib anda parem konstanditegur — mis on täpselt see põhjus, miks jõudlustestid väikestel sisenditel eksitavad.
-
Nüüd võta sisendiks miljon. Logaritm on vaevalt liikunud — 6,6-lt 19,9-le ehk kolm korda —, samal ajal kui N on kasvanud kümnetuhandekordseks. Suhe on nüüd 50 172.
-
Ja see ei pöördu kunagi tagasi. Avaldise N/log N tuletis on positiivne iga N korral, mis on suurem kui e, seega ei ole olemas ühtegi sisendi suurust, millest alates ruutalgoritm sellele järele jõuaks.
Vastus
Tööriist väljastab väärtused 664 ja 10 000, kui N = 100. Meeldejätmist vääriv arv on aga teine: miljoni juures on need kaks kõverat teineteisest 50 172 võrra kaugel. Keerukusklassid ei käi saja elemendi kohta ning nende võrdlemine seal on tüüpiline viis veenda ennast valima valet algoritmi — viieteistkordne vahe näib asjana, mida kiirem programmeerimiskeel võiks tasa teha. Nihuta liugurit ülespoole ja vaata, kuidas suhe kaasa liigub. See on ühtlasi põhjus, miks logaritmi praktikas nii sageli eiratakse: see kasvas kolm korda, kui sisend kasvas kümne tuhat korda.
-
Õpitee
Loe tööd, mitte sekundeid
Allikad (1)
- The definition the lesson states, and the case for using it carefully: D. E. Knuth, “Big Omicron and big Omega and big Theta.” ACM SIGACT News 8, 18–24, 1976.