Hvad er Big-O Notation?

Hvad er Big-O Notation?

Har du nogensinde undret dig over, hvorfor et program, du skrev, tog så lang tid at køre? Måske vil du gerne vide, om du kan gøre din kode mere effektiv. At forstå, hvordan kodekørsler kan bringe din kode til det næste niveau. Big-O-notation er et praktisk værktøj til at beregne, hvor effektiv din kode egentlig er.





Hvad er Big-O Notation?

Big-O-notation giver dig en måde at beregne, hvor lang tid det vil tage at køre din kode. Du kan fysisk tid, hvor lang tid din kode tager at køre, men med den metode er det svært at fange små tidsforskelle. For eksempel er den tid, det tager mellem at køre 20 og 50 linjer med kode, meget lille. I et stort program kan disse ineffektiviteter imidlertid tilføje sig.





hvorfor får ikke macs virus

Big-O-notation tæller, hvor mange trin en algoritme skal udføre for at måle dens effektivitet. At nærme sig din kode på denne måde kan være meget effektiv, hvis du skal justere din kode for at øge effektiviteten. Big-O-notation giver dig mulighed for at måle forskellige algoritmer ud fra antallet af trin, det kræver for at køre og objektivt sammenligne algoritmernes effektivitet.





Hvordan beregner du Big-O Notation

Lad os overveje to funktioner, der tæller, hvor mange individuelle strømper der er i en skuffe. Hver funktion tager antallet af par sokker og returnerer antallet af individuelle strømper. Koden er skrevet i Python, men det påvirker ikke, hvordan vi vil tælle antallet af trin.

Algoritme 1:



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

Algoritme 2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

Dette er et fjollet eksempel, og du burde let kunne se, hvilken algoritme der er mere effektiv. Men for øvelse, lad os løbe igennem hver.





RELATEREDE: Hvad er en funktion i programmering?

Algoritme 1 har mange trin:





  1. Det tildeler variablen individualSocks en værdi på nul.
  2. Det tildeler variabelen i en værdi på en.
  3. Det sammenligner værdien af ​​i med numberOfPairs.
  4. Det tilføjer to til individualSocks.
  5. Det tildeler den øgede værdi af individualSocks til sig selv.
  6. Det øger jeg med en.
  7. Den går derefter tilbage gennem trin 3 til 6 i samme antal gange som (indiviualSocks - 1).

Antallet af trin, vi skal udføre for algoritme et, kan udtrykkes som:

4n + 2

Der er fire trin, vi skal udføre n gange. I dette tilfælde ville n svare til værdien af ​​numberOfPairs. Der er også 2 trin, der udføres en gang.

Til sammenligning har algoritme 2 bare et trin. Værdien af ​​numberOfPairs ganges med to. Vi vil udtrykke det som:

1

Hvis det ikke allerede var tydeligt, kan vi nu let se, at algoritme 2 er en del mere effektiv.

Big-O analyse

Generelt, når du er interesseret i Big-O-notationen af ​​en algoritme, er du mere interesseret i den samlede effektivitet og mindre i så fald i finkornet analyse af antallet af trin. For at forenkle notationen kan vi bare angive størrelsen af ​​effektiviteten.

I eksemplerne ovenfor vil algoritme 2 blive udtrykt som en:

O(1)

Men algoritme 1 ville blive forenklet som:

O(n)

Dette hurtige øjebliksbillede fortæller os, hvordan effektiviteten af ​​algoritme 1 er bundet til værdien af ​​n. Jo større tallet er, desto flere trin skal algoritmen gennemføre.

Lineær kode

Billedkredit: Nick Fledderus/ Substantivsprojekt

Fordi vi ikke kender værdien af ​​n, er det mere nyttigt at tænke over, hvordan værdien af ​​n påvirker mængden af ​​kode, der skal køre. I algoritme 1 kan vi sige, at forholdet er lineært. Hvis du plotter antallet af trin vs. værdien af ​​n får du en lige linje, der går op.

Kvadratisk kode

Ikke alle relationer er så enkle som det lineære eksempel. Forestil dig, at du har et 2D -array, og du gerne vil søge efter en værdi i arrayet. Du kan oprette en algoritme som denne:

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

I dette eksempel afhænger antallet af trin af antallet af arrays i arraySearched og antallet af værdier i hvert array. Så det forenklede antal trin ville n * n eller n².

få en ny e -mail adresse

Billedkredit: Nick Fledderus/ Substantivsprojekt

Dette forhold er et kvadratisk forhold, hvilket betyder, at antallet af trin i vores algoritme vokser eksponentielt med n. I Big-O notation ville du skrive det som:

O(n²)

RELATEREDE: Nyttige værktøjer til at kontrollere, rense og optimere CSS -filer

Logaritmisk kode

Selvom der er mange andre relationer, er det sidste forhold, vi vil se på, logaritmiske forhold. For at opdatere din hukommelse er loggen for et tal eksponentværdien, der kræves for at nå et tal givet en base. For eksempel:

log 2 (8) = 3

Loggen er lig med tre, fordi hvis vores base var 2, ville vi have brug for en eksponentværdi på 3 for at komme til tallet 8.

Billedkredit: Nick Fledderus/ Substantivsprojekt

Så forholdet mellem en logaritmisk funktion er det modsatte af et eksponentielt forhold. Når n stiger, kræves færre nye trin for at køre algoritmen.

Umiddelbart virker dette kontraintuitivt. Hvordan kan en algoritmes trin vokse langsommere end n? Et godt eksempel på dette er binære søgninger. Lad os overveje en algoritme til at søge efter et tal i en række unikke værdier.

  • Vi starter med et array til søgning, der er i rækkefølge fra mindste til største.
  • Dernæst kontrollerer vi værdien i midten af ​​arrayet.
  • Hvis dit tal er højere, ekskluderer vi de lavere tal i vores søgning, og hvis tallet var lavere, ekskluderer vi de højere tal.
  • Nu vil vi se på midten af ​​de resterende tal.
  • Igen vil vi ekskludere halvdelen af ​​tallene baseret på, om vores målværdi er højere eller lavere end den midterste værdi.
  • Vi fortsætter denne proces, indtil vi finder vores mål eller fastslår, at det ikke er på listen.

Som du kan se, da binære søgninger eliminerer halvdelen af ​​de mulige værdier hver gang, da n bliver større, påvirkes effekten på antallet af gange, vi kontrollerer arrayet, knap. For at udtrykke dette i Big-O-notation ville vi skrive:

O(log(n))

Betydningen af ​​Big-O Notation

Big-O nation giver dig en hurtig og nem måde at kommunikere på, hvor effektiv en algoritme er. Dette gør det lettere at bestemme mellem forskellige algoritmer. Dette kan være særligt nyttigt, hvis du bruger en algoritme fra et bibliotek og ikke nødvendigvis ved, hvordan koden ser ud.

hvor mange eksterne harddiske xbox one

Når du først lærer at kode, begynder du med lineære funktioner. Som du kan se fra grafen ovenfor, vil det komme dig meget langt. Men efterhånden som du bliver mere erfaren og begynder at opbygge mere kompleks kode, begynder effektiviteten at blive et problem. En forståelse af, hvordan du kvantificerer effektiviteten af ​​din kode, giver dig de værktøjer, du har brug for til at begynde at indstille den til effektivitet og veje fordele og ulemper ved algoritmer.

Del Del Tweet E -mail 10 mest almindelige programmerings- og kodningsfejl

Kodningsfejl kan føre til så mange problemer. Disse tips hjælper dig med at undgå programmeringsfejl og holder din kode meningsfuld.

Læs Næste
Relaterede emner
  • Programmering
  • Programmering
Om forfatteren Jennifer Seaton(21 artikler udgivet)

J. Seaton er en Science Writer, der har specialiseret sig i at nedbryde komplekse emner. Hun har en ph.d. fra University of Saskatchewan; hendes forskning fokuserede på at udnytte spilbaseret læring til at øge elevernes engagement online. Når hun ikke arbejder, finder du hende med sin læsning, videospil eller havearbejde.

Mere fra Jennifer Seaton

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere