Wat is Big-O-notatie?

Wat is Big-O-notatie?

Heb je je ooit afgevraagd waarom een ​​programma dat je schreef zo ​​lang duurde om te draaien? Misschien wilt u weten of u uw code efficiënter kunt maken. Als u begrijpt hoe code wordt uitgevoerd, kunt u uw code naar een hoger niveau tillen. Big-O-notatie is een handig hulpmiddel om te berekenen hoe efficiënt uw code werkelijk is.





Wat is Big-O-notatie?

Big-O-notatie geeft u een manier om te berekenen hoe lang het duurt om uw code uit te voeren. U kunt fysiek timen hoe lang het duurt voordat uw code wordt uitgevoerd, maar met die methode is het moeilijk om kleine tijdsverschillen te vangen. De tijd die nodig is tussen het uitvoeren van 20 en 50 regels code is bijvoorbeeld erg klein. In een groot programma kunnen die inefficiënties echter oplopen.





donkere modus van bestandsverkenner werkt niet

Big-O-notatie telt hoeveel stappen een algoritme moet uitvoeren om de efficiëntie te meten. Het op deze manier benaderen van uw code kan zeer effectief zijn als u uw code moet afstemmen om de efficiëntie te verhogen. Met Big-O-notatie kunt u verschillende algoritmen meten aan de hand van het aantal stappen dat nodig is om de algoritmen uit te voeren en objectief de efficiëntie van de algoritmen vergelijken.





Hoe bereken je Big-O-notatie?

Laten we eens kijken naar twee functies die tellen hoeveel individuele sokken er in een la zitten. Elke functie neemt het aantal paar sokken en retourneert het aantal individuele sokken. De code is geschreven in Python, maar dat heeft geen invloed op hoe we het aantal stappen zouden tellen.

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

Dit is een dwaas voorbeeld en u zou gemakkelijk moeten kunnen zien welk algoritme efficiënter is. Maar laten we ze voor de praktijk eens doornemen.





VERWANT: Wat is een functie in programmeren?

Algoritme 1 heeft veel stappen:





  1. Het kent een waarde van nul toe aan de variabele individualSocks.
  2. Het kent een waarde van één toe aan de variabele i.
  3. Het vergelijkt de waarde van i met numberOfPairs.
  4. Het voegt er twee toe aan individualSocks.
  5. Het kent de verhoogde waarde van individualSocks aan zichzelf toe.
  6. Het verhoogt i met één.
  7. Vervolgens keert het terug door stappen 3 tot 6 voor hetzelfde aantal keren als (indiviualSocks - 1).

Het aantal stappen dat we moeten voltooien voor algoritme één kan worden uitgedrukt als:

4n + 2

Er zijn vier stappen die we n keer moeten doorlopen. In dit geval zou n gelijk zijn aan de waarde van numberOfPairs. Er zijn ook 2 stappen die eenmalig worden doorlopen.

Ter vergelijking: algoritme 2 heeft maar één stap. De waarde van numberOfPairs wordt vermenigvuldigd met twee. We zouden dat uitdrukken als:

1

Als het nog niet duidelijk was, kunnen we nu gemakkelijk zien dat algoritme 2 een stuk efficiënter is.

Big-O-analyse

Over het algemeen ben je, wanneer je geïnteresseerd bent in de Big-O-notatie van een algoritme, meer geïnteresseerd in de algehele efficiëntie en minder in de fijnkorrelige analyse van het aantal stappen. Om de notatie te vereenvoudigen, kunnen we gewoon de grootte van de efficiëntie aangeven.

In de bovenstaande voorbeelden zou algoritme 2 worden uitgedrukt als één:

O(1)

Maar algoritme 1 zou worden vereenvoudigd als:

O(n)

Deze snelle momentopname vertelt ons hoe de efficiëntie van algoritme één is gekoppeld aan de waarde van n. Hoe groter het getal, hoe meer stappen het algoritme moet doorlopen.

Lineaire code

Image Credit: Nick Fledderus/ zelfstandig naamwoord project

Omdat we de waarde van n niet kennen, is het handiger om na te denken over hoe de waarde van n van invloed is op de hoeveelheid code die moet worden uitgevoerd. In algoritme 1 kunnen we zeggen dat de relatie lineair is. Als je het aantal stappen uitzet tegen de waarde van n, krijg je een rechte lijn die omhoog gaat.

Kwadratische code

Niet alle relaties zijn zo eenvoudig als het lineaire voorbeeld. Stel u voor dat u een 2D-array hebt en dat u naar een waarde in de array wilt zoeken. Je zou een algoritme als dit kunnen maken:

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

In dit voorbeeld hangt het aantal stappen af ​​van het aantal arrays in arraySearched en het aantal waarden in elke array. Het vereenvoudigde aantal stappen zou dus n * n of n² zijn.

hoe kopieer ik een afspeellijst op spotify

Image Credit: Nick Fledderus/ zelfstandig naamwoord project

Deze relatie is een kwadratische relatie, wat betekent dat het aantal stappen in ons algoritme exponentieel groeit met n. In Big-O-notatie zou je het schrijven als:

O(n²)

VERWANT: Handige hulpmiddelen om CSS-bestanden te controleren, op te schonen en te optimaliseren

Logaritmische code

Hoewel er veel andere relaties zijn, is de laatste relatie waar we naar zullen kijken logaritmische relaties. Om je geheugen op te frissen, is het logboek van een getal de exponentwaarde die nodig is om een ​​getal met een basis te bereiken. Bijvoorbeeld:

log 2 (8) = 3

De log is gelijk aan drie, want als onze basis 2 was, zouden we een exponentwaarde van 3 nodig hebben om bij het getal 8 te komen.

Image Credit: Nick Fledderus/ zelfstandig naamwoord project

De relatie van een logaritmische functie is dus het tegenovergestelde van een exponentiële relatie. Naarmate n toeneemt, zijn er minder nieuwe stappen nodig om het algoritme uit te voeren.

Op het eerste gezicht lijkt dit contra-intuïtief. Hoe kunnen de stappen van een algoritme langzamer groeien dan n? Een goed voorbeeld hiervan zijn binaire zoekopdrachten. Laten we eens kijken naar een algoritme om te zoeken naar een getal in een reeks unieke waarden.

  • We beginnen met een array om te zoeken in de volgorde van klein naar groot.
  • Vervolgens controleren we de waarde in het midden van de array.
  • Als uw nummer hoger is, zullen we de lagere nummers uitsluiten in onze zoekopdracht en als het nummer lager was, zullen we de hogere nummers uitsluiten.
  • Nu zullen we kijken naar het middelste nummer van de resterende nummers.
  • Nogmaals, we zullen de helft van de aantallen uitsluiten op basis van het feit of onze doelwaarde hoger of lager is dan de middelste waarde.
  • We gaan door met dit proces totdat we ons doel hebben gevonden of vaststellen dat het niet in de lijst staat.

Zoals je kunt zien, wordt het effect op het aantal keren dat we de array controleren nauwelijks beïnvloed, aangezien binaire zoekopdrachten elke keer de helft van de mogelijke waarden elimineren, naarmate n groter wordt. Om dit in Big-O-notatie uit te drukken, zouden we schrijven:

O(log(n))

Het belang van Big-O-notatie

Big-O nation geeft u een snelle en gemakkelijke manier om te communiceren hoe efficiënt een algoritme is. Dit maakt het gemakkelijker om te kiezen tussen verschillende algoritmen. Dit kan met name handig zijn als u een algoritme uit een bibliotheek gebruikt en niet per se weet hoe de code eruitziet.

hoe een Dell-laptop op te laden zonder oplader

Wanneer u voor het eerst leert coderen, begint u met lineaire functies. Zoals je in de bovenstaande grafiek kunt zien, kom je heel ver. Maar naarmate u meer ervaring krijgt en complexere code begint te bouwen, begint efficiëntie een probleem te worden. Als u begrijpt hoe u de efficiëntie van uw code kunt kwantificeren, krijgt u de tools die u nodig hebt om deze af te stemmen op efficiëntie en de voor- en nadelen van algoritmen af ​​te wegen.

Deel Deel Tweeten E-mail 10 meest voorkomende programmeer- en codeerfouten

Codeerfouten kunnen tot zoveel problemen leiden. Deze tips helpen u programmeerfouten te voorkomen en uw code zinvol te houden.

Lees volgende
Gerelateerde onderwerpen
  • Programmeren
  • Programmeren
Over de auteur Jennifer Seaton(21 artikelen gepubliceerd)

J. Seaton is een wetenschapsschrijver die gespecialiseerd is in het opsplitsen van complexe onderwerpen. Ze is gepromoveerd aan de Universiteit van Saskatchewan; haar onderzoek was gericht op het gebruik van game-based learning om de online betrokkenheid van studenten te vergroten. Als ze niet aan het werk is, vind je haar terwijl ze leest, videospelletjes speelt of tuiniert.

Meer van Jennifer Seaton

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren