Co je Big-O notace?

Co je Big-O notace?

Přemýšleli jste někdy nad tím, proč program, který jste napsali, trval tak dlouho? Možná byste chtěli vědět, jestli můžete svůj kód zefektivnit. Pochopení toho, jak spuštění kódu může váš kód posunout na další úroveň. Big-O notation je praktický nástroj pro výpočet efektivity vašeho kódu.





Co je Big-O notace?

Big-O notation vám dává způsob, jak vypočítat, jak dlouho bude trvat spuštění vašeho kódu. Můžete fyzicky časovat, jak dlouho trvá spuštění vašeho kódu, ale s touto metodou je těžké zachytit malé časové rozdíly. Například doba mezi spuštěním 20 a 50 řádků kódu je velmi malá. Ve velkém programu se však tyto neefektivity mohou sčítat.





co je fond tvůrce na tiktok

Big-O notace počítá, kolik kroků musí algoritmus provést, aby změřil jeho účinnost. Přistupování k vašemu kódu tímto způsobem může být velmi efektivní, pokud potřebujete vyladit kód pro zvýšení efektivity. Big-O notation vám umožní měřit různé algoritmy podle počtu kroků, které vyžaduje ke spuštění, a objektivně porovnat účinnost algoritmů.





Jak vypočítáte notaci Big-O

Uvažujme dvě funkce, které počítají, kolik jednotlivých ponožek je v zásuvce. Každá funkce vezme počet párů ponožek a vrátí počet jednotlivých ponožek. Kód je napsán v Pythonu, ale to nemá vliv na to, jak bychom počítali počet kroků.

Algoritmus 1:



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

Algoritmus 2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

Toto je hloupý příklad a měli byste být schopni snadno zjistit, který algoritmus je účinnější. Pro praxi si ale projdeme každou.





PŘÍBUZNÝ: Co je funkce v programování?

Algoritmus 1 má mnoho kroků:





  1. Proměnné individualSocks přiřadí hodnotu nula.
  2. Proměnné i přiřadí hodnotu jedna.
  3. Porovnává hodnotu i s numberOfPairs.
  4. Přidá dva do individualSocks.
  5. Přiřazuje k sobě zvýšenou hodnotu individualSocks.
  6. Zvyšuje se i po jednom.
  7. Poté se opakuje v krocích 3 až 6 stejně často jako (indiviualSocks - 1).

Počet kroků, které musíme pro algoritmus jeden dokončit, lze vyjádřit jako:

4n + 2

Existují čtyři kroky, které musíme provést nkrát. V tomto případě by n odpovídalo hodnotě numberOfPairs. K dispozici jsou také 2 kroky, které jsou dokončeny jednou.

Pro srovnání, algoritmus 2 má jen jeden krok. Hodnota numberOfPairs se vynásobí dvěma. Vyjádřili bychom to takto:

1

Pokud to již nebylo zřejmé, nyní můžeme snadno vidět, že algoritmus 2 je o něco účinnější.

Big-O analýza

Obecně platí, že pokud vás zajímá notace algoritmu Big-O, zajímá vás více celková účinnost a méně už jemná analýza počtu kroků. Pro zjednodušení zápisu můžeme pouze uvést velikost účinnosti.

Ve výše uvedených příkladech by byl algoritmus 2 vyjádřen jako jeden:

O(1)

Algoritmus 1 by však byl zjednodušen jako:

O(n)

Tento rychlý snímek nám říká, jak je účinnost algoritmu jedna svázána s hodnotou n. Čím větší číslo, tím více kroků bude muset algoritmus dokončit.

Lineární kód

Uznání: Nick Fledderus/ Projekt podstatného jména

Protože neznáme hodnotu n, je užitečnější zamyslet se nad tím, jak hodnota n ovlivňuje množství kódu, který je potřeba spustit. V algoritmu 1 můžeme říci, že vztah je lineární. Pokud vykreslíte počet kroků vs. hodnotu n, dostanete přímku, která jde nahoru.

Kvadratický kód

Ne všechny vztahy jsou tak jednoduché jako lineární příklad. Představte si, že máte 2D pole a chtěli byste v poli vyhledat hodnotu. Algoritmus můžete vytvořit takto:

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

V tomto případě závisí počet kroků na počtu polí v arraySearched a počtu hodnot v každém poli. Zjednodušený počet kroků by tedy byl n * n nebo n².

převést obrázek na vektor v Illustratoru

Uznání: Nick Fledderus/ Projekt podstatného jména

Tento vztah je kvadratický vztah, což znamená, že počet kroků v našem algoritmu exponenciálně roste s n. V notaci Big-O byste to napsali jako:

O(n²)

PŘÍBUZNÝ: Užitečné nástroje pro kontrolu, čištění a optimalizaci souborů CSS

Logaritmický kód

Ačkoli existuje mnoho dalších vztahů, poslední vztah, na který se podíváme, jsou logaritmické vztahy. Chcete -li obnovit paměť, protokol čísla je hodnota exponentu potřebná k dosažení čísla daného základu. Například:

log 2 (8) = 3

Protokol se rovná třem, protože kdyby naše základna byla 2, potřebovali bychom hodnotu exponentu 3, abychom se dostali k číslu 8.

Uznání: Nick Fledderus/ Projekt podstatného jména

Vztah logaritmické funkce je tedy opakem exponenciálního vztahu. Jak se zvyšuje n, ke spuštění algoritmu je zapotřebí méně nových kroků.

Na první pohled to vypadá neintuitivně. Jak mohou kroky algoritmu růst pomaleji než n? Dobrým příkladem jsou binární vyhledávání. Zvažme algoritmus pro hledání čísla v poli jedinečných hodnot.

  • Začneme polem pro vyhledávání, které je v pořadí od nejmenšího po největší.
  • Dále zkontrolujeme hodnotu uprostřed pole.
  • Pokud je vaše číslo vyšší, vyloučíme nižší čísla z našeho vyhledávání a pokud bylo číslo nižší, vyloučíme vyšší čísla.
  • Nyní se podíváme na prostřední číslo zbývajících čísel.
  • Opět vyloučíme polovinu čísel podle toho, zda je naše cílová hodnota vyšší nebo nižší než střední hodnota.
  • V tomto procesu budeme pokračovat, dokud nenajdeme svůj cíl nebo nezjistíme, že není v seznamu.

Jak vidíte, protože binární vyhledávání eliminuje polovinu možných hodnot při každém průchodu, jak se n zvětšuje, vliv na počet kontrol, které kontrolujeme, je sotva ovlivněn. Abychom to vyjádřili v notaci Big-O, napsali bychom:

O(log(n))

Důležitost Big-O notace

Big-O nation vám poskytuje rychlý a snadný způsob komunikace, jak účinný je algoritmus. To usnadňuje rozhodování mezi různými algoritmy. To může být obzvláště užitečné, pokud používáte algoritmus z knihovny a nutně nevíte, jak kód vypadá.

jak zlepšit rychlost stahování páry

Když se poprvé naučíte kódovat, začnete s lineárními funkcemi. Jak vidíte z grafu výše, dostanete se velmi daleko. Ale jak se stanete zkušenějšími a začnete vytvářet složitější kód, účinnost se stává problémem. Pochopení toho, jak kvantifikovat účinnost kódu, vám poskytne nástroje, které potřebujete k jeho vyladění pro efektivitu a zvážení kladů a záporů algoritmů.

Podíl Podíl tweet E-mailem 10 nejběžnějších chyb při programování a kódování

Kódování chyb může vést k mnoha problémům. Tyto tipy vám pomohou vyhnout se chybám při programování a zachovat smysluplnost kódu.

Číst dále
Související témata
  • Programování
  • Programování
O autorovi Jennifer Seaton(21 článků zveřejněno)

J. Seaton je vědecký spisovatel, který se specializuje na bourání složitých témat. Má doktorát z University of Saskatchewan; její výzkum se zaměřil na využití herního učení ke zvýšení zapojení studentů online. Když nepracuje, najdete ji při čtení, hraní videoher nebo zahradničení.

Více od Jennifer Seaton

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru