Vad är Big-O Notation?

Vad är Big-O Notation?

Har du någonsin undrat varför ett program du skrev tog så lång tid att köra? Kanske skulle du vilja veta om du kan göra din kod mer effektiv. Att förstå hur kodkörningar kan ta din kod till nästa nivå. Big-O-notation är ett praktiskt verktyg för att beräkna hur effektiv din kod verkligen är.





Vad är Big-O Notation?

Big-O-notation ger dig ett sätt att beräkna hur lång tid det tar att köra din kod. Du kan fysiskt ta tid hur lång tid din kod tar att köra, men med den metoden är det svårt att fånga små tidsskillnader. Till exempel är tiden det tar mellan att köra 20 och 50 rader kod väldigt liten. Men i ett stort program kan dessa ineffektivitet öka.





titta på filmer online gratis utan registrering

Big-O-notering räknar hur många steg en algoritm måste utföra för att mäta dess effektivitet. Att närma sig din kod på detta sätt kan vara mycket effektivt om du behöver ställa in din kod för att öka effektiviteten. Med Big-O-notering kan du mäta olika algoritmer med antalet steg som krävs för att köra och objektivt jämföra algoritmernas effektivitet.





Hur beräknar du Big-O Notation

Låt oss överväga två funktioner som räknar hur många enskilda strumpor som finns i en låda. Varje funktion tar antalet par strumpor och returnerar antalet enskilda strumpor. Koden är skriven i Python, men det påverkar inte hur vi skulle räkna antalet steg.

Algoritm 1:



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

Algoritm 2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

Detta är ett dumt exempel, och du borde enkelt kunna se vilken algoritm som är mer effektiv. Men för övning, låt oss köra igenom varje.





RELATERAD: Vad är en funktion i programmering?

Algoritm 1 har många steg:





  1. Den tilldelar variabeln individualSocks ett värde på noll.
  2. Det tilldelar variabeln i ett värde av ett.
  3. Det jämför värdet av i med numberOfPairs.
  4. Det lägger till två till individualSocks.
  5. Det tilldelar det ökade värdet av individualSocks till sig själv.
  6. Det ökar jag med en.
  7. Den går sedan tillbaka genom steg 3 till 6 samma antal gånger som (indiviualSocks - 1).

Antalet steg vi måste utföra för algoritm ett kan uttryckas som:

4n + 2

Det finns fyra steg som vi måste slutföra n gånger. I det här fallet skulle n motsvara värdet på numberOfPairs. Det finns också 2 steg som slutförs en gång.

Som jämförelse har algoritm 2 bara ett steg. Värdet på numberOfPairs multipliceras med två. Vi skulle uttrycka det som:

1

Om det inte redan var uppenbart kan vi nu enkelt se att algoritm 2 är ganska mycket effektivare.

Big-O-analys

I allmänhet, när du är intresserad av Big-O-notationen av en algoritm, är du mer intresserad av den totala effektiviteten och mindre så i finkornig analys av antalet steg. För att förenkla notationen kan vi bara ange storleken på effektiviteten.

I exemplen ovan skulle algoritm 2 uttryckas som en:

O(1)

Men algoritm 1 skulle förenklas som:

O(n)

Denna snabba ögonblicksbild berättar hur effektiviteten hos algoritm ett är knuten till värdet av n. Ju större siffra desto fler steg måste algoritmen slutföra.

Linjär kod

Bildkredit: Nick Fledderus/ Substantivprojekt

Eftersom vi inte vet värdet på n är det mer användbart att tänka på hur värdet av n påverkar mängden kod som behöver köras. I algoritm 1 kan vi säga att förhållandet är linjärt. Om du ritar antalet steg mot värdet på n får du en rak linje som går upp.

Kvadratisk kod

Alla relationer är inte lika enkla som det linjära exemplet. Tänk dig att du har en 2D -array och du vill söka efter ett värde i arrayen. Du kan skapa en algoritm så här:

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

I det här exemplet beror antalet steg på antalet matriser i arraySearched och antalet värden i varje array. Så det förenklade antalet steg skulle n * n eller n².

ändra iphone backup plats windows 10

Bildkredit: Nick Fledderus/ Substantivprojekt

Denna relation är en kvadratisk relation, vilket innebär att antalet steg i vår algoritm växer exponentiellt med n. I Big-O notation skulle du skriva det som:

O(n²)

RELATERAD: Användbara verktyg för att kontrollera, rengöra och optimera CSS -filer

Logaritmisk kod

Även om det finns många andra relationer, är det sista förhållandet vi kommer att titta på logaritmiska relationer. För att uppdatera ditt minne är loggen för ett tal det exponentvärde som krävs för att nå ett tal som ges en bas. Till exempel:

log 2 (8) = 3

Loggen är lika med tre eftersom om vår bas var 2, skulle vi behöva ett exponentvärde på 3 för att komma till siffran 8.

Bildkredit: Nick Fledderus/ Substantivprojekt

Så förhållandet mellan en logaritmisk funktion är motsatsen till ett exponentiellt förhållande. När n ökar krävs färre nya steg för att köra algoritmen.

Vid en första anblick verkar detta kontraintuitivt. Hur kan en algoritms steg växa långsammare än n? Ett bra exempel på detta är binära sökningar. Låt oss överväga en algoritm för att söka efter ett tal i en rad unika värden.

  • Vi börjar med en matris för att söka efter den minsta till den största.
  • Därefter kommer vi att kontrollera värdet i mitten av matrisen.
  • Om ditt nummer är högre kommer vi att utesluta de lägre siffrorna i vår sökning och om antalet var lägre kommer vi att utesluta de högre siffrorna.
  • Nu ska vi titta på mitten av de återstående talen.
  • Återigen kommer vi att utesluta halva siffrorna baserat på om vårt målvärde är högre eller lägre än det mellersta värdet.
  • Vi kommer att fortsätta denna process tills vi hittar vårt mål eller fastställa att det inte finns i listan.

Som du kan se, eftersom binära sökningar eliminerar hälften av de möjliga värdena varje pass, när n blir större, påverkas effekten på antalet gånger vi kontrollerar matrisen knappt. För att uttrycka detta i Big-O-notering skulle vi skriva:

O(log(n))

Betydelsen av Big-O Notation

Big-O nation ger dig ett snabbt och enkelt sätt att kommunicera hur effektiv en algoritm är. Detta gör det lättare att välja mellan olika algoritmer. Detta kan vara särskilt användbart om du använder en algoritm från ett bibliotek och inte nödvändigtvis vet hur koden ser ut.

hur man laddar ner alla foton från facebooksidan

När du först lär dig att koda börjar du med linjära funktioner. Som du kan se från grafen ovan kommer det att nå dig väldigt långt. Men när du blir mer erfaren och börjar bygga mer komplex kod börjar effektiviteten bli ett problem. En förståelse för hur man kvantifierar effektiviteten i din kod ger dig de verktyg du behöver för att börja justera den för effektivitet och väga fördelar och nackdelar med algoritmer.

Dela med sig Dela med sig Tweet E-post 10 vanligaste programmerings- och kodningsfel

Kodningsfel kan leda till så många problem. Dessa tips hjälper dig att undvika programmeringsfel och hålla koden meningsfull.

Läs Nästa
Relaterade ämnen
  • Programmering
  • Programmering
Om författaren Jennifer Seaton(21 artiklar publicerade)

J. Seaton är en Science Writer som specialiserat sig på att bryta ner komplexa ämnen. Hon har en doktorsexamen från University of Saskatchewan; hennes forskning fokuserade på att använda spelbaserat lärande för att öka studentens engagemang online. När hon inte arbetar hittar du henne med sin läsning, spelande tv -spel eller trädgårdsarbete.

Mer från Jennifer Seaton

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera