Kas yra „Big-O“ žymėjimas?

Kas yra „Big-O“ žymėjimas?

Ar kada susimąstėte, kodėl jūsų parašytos programos vykdymas užtruko taip ilgai? Galbūt norėtumėte sužinoti, ar galite padaryti kodą efektyvesnį. Suprasdami, kaip vykdomas kodas, galite perkelti kodą į kitą lygį. „Big-O“ žymėjimas yra patogus įrankis apskaičiuoti, koks jūsų kodas iš tikrųjų yra efektyvus.





Kas yra „Big-O“ žymėjimas?

„Big-O“ žymėjimas suteikia jums galimybę apskaičiuoti, kiek laiko užtruks jūsų kodas. Galite fiziškai nustatyti, kiek laiko užtruks jūsų kodas, tačiau naudojant šį metodą sunku pastebėti nedidelius laiko skirtumus. Pavyzdžiui, laikas nuo 20 iki 50 kodo eilučių yra labai mažas. Tačiau didelėje programoje šie neefektyvumai gali padidėti.





kodėl sukčiai nori dovanų kortelių?

„Big-O“ žymėjimas skaičiuoja, kiek žingsnių algoritmas turi atlikti, kad įvertintų jo efektyvumą. Tokiu būdu požiūris į kodą gali būti labai efektyvus, jei jums reikia sureguliuoti kodą, kad padidintumėte efektyvumą. „Big-O“ žymėjimas leis išmatuoti skirtingus algoritmus pagal žingsnių skaičių, reikalingą paleisti, ir objektyviai palyginti algoritmų efektyvumą.





Kaip apskaičiuoti „Big-O“ žymėjimą

Apsvarstykime dvi funkcijas, skaičiuojančias, kiek atskirų kojinių yra stalčiuje. Kiekviena funkcija paima kojinių porų skaičių ir grąžina atskirų kojinių skaičių. Kodas parašytas „Python“, tačiau tai neturi įtakos tam, kaip skaičiuotume žingsnių skaičių.

1 algoritmas:



def sockCounter(numberOfPairs):
individualSocks = 0
for x in range(numberOfPairs):
individualSocks = individualSocks + 2
return individualSocks

2 algoritmas:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

Tai kvailas pavyzdys, ir jūs turėtumėte lengvai pasakyti, kuris algoritmas yra efektyvesnis. Bet dėl ​​praktikos, pereikime prie kiekvieno.





SUSIJĘS: Kas yra programavimo funkcija?

1 algoritmas turi daug žingsnių:





  1. Jis kintamajam individualSocks priskiria nulinę reikšmę.
  2. Jis kintamajam i priskiria vieną reikšmę.
  3. Jis lygina i reikšmę su numberOfPairs.
  4. Tai prideda du prie individualių kojinių.
  5. Padidintą individualSocks vertę jis priskiria sau.
  6. Jis padidėja i vienu.
  7. Tada jis grįžta per 3–6 veiksmus tiek pat kartų, kiek (indiviualSocks - 1).

Veiksmų, kuriuos turime atlikti pagal vieną algoritmą, skaičių galima išreikšti taip:

4n + 2

Yra keturi žingsniai, kuriuos turime atlikti n kartų. Šiuo atveju n būtų lygi skaičius numberOfPairs. Taip pat yra 2 veiksmai, kurie baigiami vieną kartą.

Palyginimui, 2 algoritmas turi tik vieną žingsnį. „NumberOfPairs“ vertė padauginama iš dviejų. Mes tai išsakytume taip:

1

Jei tai dar nebuvo akivaizdu, dabar galime lengvai pastebėti, kad 2 algoritmas yra šiek tiek efektyvesnis.

„Big-O“ analizė

Paprastai, kai jus domina algoritmo „Big-O“ žymėjimas, jus labiau domina bendras efektyvumas, o mažiau-smulkių žingsnių skaičiaus analizė. Norėdami supaprastinti žymėjimą, galime tiesiog nurodyti efektyvumo dydį.

Pirmiau pateiktuose pavyzdžiuose 2 algoritmas būtų išreikštas kaip vienas:

O(1)

Bet 1 algoritmas būtų supaprastintas taip:

O(n)

Šis trumpas momentinis vaizdas mums parodo, kaip vieno algoritmo efektyvumas yra susietas su n reikšme. Kuo didesnis skaičius, tuo daugiau veiksmų algoritmas turės atlikti.

Linijinis kodas

Vaizdo kreditas: Nickas Fledderusas/ Daiktavardžio projektas

Kadangi mes nežinome n reikšmės, naudingiau pagalvoti apie tai, kaip n reikšmė turi įtakos paleidžiamo kodo kiekiui. 1 algoritme galime pasakyti, kad ryšys yra tiesinis. Jei nubraižysite žingsnių skaičių ir n reikšmę, gausite tiesią liniją, kuri didės.

Kvadratinis kodas

Ne visi santykiai yra tokie paprasti, kaip linijinis pavyzdys. Įsivaizduokite, kad turite 2D masyvą ir norėtumėte ieškoti masyvo vertės. Galite sukurti tokį algoritmą:

def searchForValue(targetValue, arraySearched):
foundTarget = False
for x in arraySearched:
for y in x:
if(y == targetValue):
foundTarget = True
return foundTarget

Šiame pavyzdyje veiksmų skaičius priklauso nuo masyvo masyvo paieškoje ir reikšmių skaičiaus kiekviename masyve. Taigi supaprastintas žingsnių skaičius būtų n * n arba n².

kaip ką nors pašalinti iš tolesnio žiūrėjimo „netflix“

Vaizdo kreditas: Nickas Fledderus/ Daiktavardžio projektas

Šis ryšys yra kvadratinis ryšys, o tai reiškia, kad žingsnių skaičius mūsų algoritme auga eksponentiškai su n. „Big-O“ žymėjime jį parašytumėte taip:

O(n²)

SUSIJĘS: Naudingi įrankiai CSS failams tikrinti, valyti ir optimizuoti

Logaritminis kodas

Nors yra daug kitų santykių, paskutiniai santykiai, į kuriuos mes žiūrėsime, yra logaritminiai santykiai. Norėdami atnaujinti savo atmintį, skaičiaus žurnalas yra rodiklio reikšmė, reikalinga norint pasiekti skaičių, nurodytą bazėje. Pavyzdžiui:

log 2 (8) = 3

Žurnalas yra lygus trims, nes jei mūsų bazė būtų 2, mums reikės eksponentinės vertės 3, kad gautume skaičių 8.

Vaizdo kreditas: Nickas Fledderus/ Daiktavardžio projektas

Taigi, logaritminės funkcijos santykis yra priešingas eksponentiniam ryšiui. Didėjant n, algoritmui paleisti reikia mažiau naujų veiksmų.

Iš pirmo žvilgsnio tai atrodo priešingai. Kaip algoritmo žingsniai gali augti lėčiau nei n? Geras to pavyzdys yra dvejetainės paieškos. Apsvarstykime algoritmą, skirtą ieškoti skaičiaus unikalių verčių masyve.

  • Pradėsime nuo paieškos masyvo, kuris yra nuo mažiausio iki didžiausio.
  • Toliau mes patikrinsime masyvo viduryje esančią vertę.
  • Jei jūsų skaičius didesnis, į paiešką neįtrauksime mažesnių skaičių, o jei skaičius buvo mažesnis, neįtrauksime didesnių skaičių.
  • Dabar pažvelgsime į likusių skaičių vidurinį skaičių.
  • Vėlgi, mes pašalinsime pusę skaičių, atsižvelgdami į tai, ar mūsų tikslinė vertė yra didesnė ar mažesnė už vidurinę vertę.
  • Tęsime šį procesą, kol surasime savo tikslą arba nustatysime, kad jo nėra sąraše.

Kaip matote, kadangi dvejetainės paieškos pašalina pusę galimų verčių kiekvieną kartą, kai n tampa didesnis, poveikis matų masyvo tikrinimų skaičiui yra beveik nepakitęs. Norėdami tai išreikšti „Big-O“ žymėjimu, rašytume:

O(log(n))

„Big-O“ žymėjimo svarba

„Big-O nation“ suteikia jums greitą ir paprastą būdą pranešti, koks efektyvus yra algoritmas. Taip lengviau apsispręsti tarp skirtingų algoritmų. Tai gali būti ypač naudinga, jei naudojate bibliotekos algoritmą ir nebūtinai žinote, kaip atrodo kodas.

nustatyti numatytąją „Google“ paskyrą „Chrome“

Kai pirmą kartą išmoksite koduoti, pradėkite nuo linijinių funkcijų. Kaip matote iš aukščiau pateiktos diagramos, tai nuves jus labai toli. Tačiau tampant labiau patyrusiam ir pradėjus kurti sudėtingesnį kodą, efektyvumas tampa problema. Supratę, kaip kiekybiškai įvertinti savo kodo efektyvumą, turėsite įrankius, kurių reikia norint pradėti derinti kodą, kad jis būtų efektyvesnis, ir pasverti algoritmų privalumus ir trūkumus.

Dalintis Dalintis „Tweet“ Paštu 10 dažniausiai pasitaikančių programavimo ir kodavimo klaidų

Kodavimo klaidos gali sukelti tiek daug problemų. Šie patarimai padės išvengti programavimo klaidų ir išlaikyti prasmingą kodą.

Skaityti toliau
Susijusios temos
  • Programavimas
  • Programavimas
Apie autorių Jennifer Seaton(Paskelbti 21 straipsniai)

J. Seatonas yra mokslo rašytojas, kurio specializacija yra sudėtingų temų skaidymas. Ji turi daktaro laipsnį Saskačevano universitete; jos tyrimas buvo sutelktas į žaidimu grindžiamo mokymosi panaudojimą, siekiant padidinti studentų dalyvavimą internete. Kai ji nedirba, ją rasite skaitydami, žaisdami vaizdo žaidimus ar dirbdami sodo darbus.

Daugiau iš Jennifer Seaton

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia