Co to jest notacja Big-O?

Co to jest notacja Big-O?

Czy kiedykolwiek zastanawiałeś się, dlaczego program, który napisałeś, trwał tak długo? Być może chciałbyś wiedzieć, czy możesz zwiększyć wydajność swojego kodu. Zrozumienie, jak działa kod, może przenieść Twój kod na wyższy poziom. Notacja Big-O jest przydatnym narzędziem do obliczania rzeczywistej wydajności kodu.





Co to jest notacja Big-O?

Notacja Big-O pozwala obliczyć, ile czasu zajmie uruchomienie kodu. Możesz fizycznie określić, ile czasu zajmuje uruchomienie kodu, ale dzięki tej metodzie trudno jest wychwycić małe różnice czasowe. Na przykład czas między uruchomieniem 20 a 50 wierszy kodu jest bardzo krótki. Jednak w dużym programie te nieefektywności mogą się sumować.





jak rozebrać kontroler Xbox One?

Notacja Big-O zlicza, ile kroków musi wykonać algorytm, aby ocenić jego wydajność. Podejście do kodu w ten sposób może być bardzo skuteczne, jeśli musisz dostroić kod w celu zwiększenia wydajności. Notacja Big-O pozwoli Ci mierzyć różne algorytmy na podstawie liczby kroków wymaganych do uruchomienia i obiektywnie porównywać wydajność algorytmów.





Jak obliczyć notację Big-O?

Rozważmy dwie funkcje, które zliczają, ile pojedynczych skarpetek znajduje się w szufladzie. Każda funkcja pobiera liczbę par skarpet i zwraca liczbę pojedynczych skarpet. Kod jest napisany w Pythonie, ale nie ma to wpływu na to, jak będziemy liczyć kroki.

Algorytm 1:



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

Algorytm 2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

To głupi przykład i powinieneś być w stanie łatwo stwierdzić, który algorytm jest bardziej wydajny. Ale dla praktyki prześledźmy każdy z nich.





ZWIĄZANE Z: Czym jest funkcja w programowaniu?

Algorytm 1 ma wiele kroków:





  1. Przypisuje wartość zero do zmiennej IndividualSocks.
  2. Przypisuje wartość jeden do zmiennej i.
  3. Porównuje wartość i do numberOfPairs.
  4. Dodaje dwa do indywidualnych skarpet.
  5. Przypisuje sobie zwiększoną wartość IndividualSocks.
  6. Zwiększa się o jeden.
  7. Następnie zapętla się z powrotem przez kroki od 3 do 6 taką samą liczbę razy, jak (indiviualSocks - 1).

Liczbę kroków, które musimy wykonać dla algorytmu 1, można wyrazić jako:

4n + 2

Istnieją cztery kroki, które musimy wykonać n razy. W tym przypadku n równałoby się wartości numberOfPairs. Istnieją również 2 kroki, które wykonuje się raz.

Dla porównania algorytm 2 ma tylko jeden krok. Wartość numberOfPairs jest mnożona przez dwa. Wyrazilibyśmy to jako:

1

Jeśli nie było to już oczywiste, możemy teraz łatwo zauważyć, że algorytm 2 jest znacznie bardziej wydajny.

Analiza Big-O

Ogólnie rzecz biorąc, gdy interesuje Cię notacja Big-O algorytmu, bardziej interesuje Cię ogólna wydajność, a mniej drobnoziarnista analiza liczby kroków. Aby uprościć notację, możemy po prostu określić wielkość sprawności.

W powyższych przykładach algorytm 2 zostałby wyrażony jako jeden:

O(1)

Ale algorytm 1 zostałby uproszczony jako:

O(n)

Ta szybka migawka mówi nam, jak wydajność algorytmu jeden jest powiązana z wartością n. Im większa liczba, tym więcej kroków algorytm będzie musiał wykonać.

Kod liniowy

Źródło: Nick Fledderus/ Rzeczownik

Ponieważ nie znamy wartości n, bardziej pomocne jest zastanowienie się, w jaki sposób wartość n wpływa na ilość kodu, który musi zostać uruchomiony. W algorytmie 1 możemy powiedzieć, że zależność jest liniowa. Jeśli wykreślisz liczbę kroków w funkcji wartości n, otrzymasz linię prostą, która idzie w górę.

Kod kwadratowy

Nie wszystkie relacje są tak proste, jak przykład liniowy. Wyobraź sobie, że masz tablicę 2D i chcesz wyszukać wartość w tablicy. Możesz stworzyć taki algorytm:

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

W tym przykładzie liczba kroków zależy od liczby tablic w arraySearched i liczby wartości w każdej tablicy. Tak więc uproszczona liczba kroków to n * n lub n².

inny komputer w tej sieci ma taki sam adres IP jak ten komputer

Źródło: Nick Fledderus/ Rzeczownik

Ta zależność jest relacją kwadratową, co oznacza, że ​​liczba kroków w naszym algorytmie rośnie wykładniczo z n. W notacji Big-O napisałbyś to jako:

O(n²)

ZWIĄZANE Z: Przydatne narzędzia do sprawdzania, czyszczenia i optymalizacji plików CSS

Kod logarytmiczny

Chociaż istnieje wiele innych relacji, ostatnią relacją, której się przyjrzymy, są relacje logarytmiczne. Aby odświeżyć pamięć, logarytm liczby jest wartością wykładnika wymaganą do osiągnięcia liczby o podstawie. Na przykład:

log 2 (8) = 3

Logarytm równa się trzy, ponieważ gdyby nasza podstawa wynosiła 2, potrzebowalibyśmy wykładnika o wartości 3, aby uzyskać liczbę 8.

Źródło: Nick Fledderus/ Rzeczownik

Zatem zależność funkcji logarytmicznej jest przeciwieństwem relacji wykładniczej. Wraz ze wzrostem n, do uruchomienia algorytmu potrzeba mniej nowych kroków.

Na pierwszy rzut oka wydaje się to sprzeczne z intuicją. Jak kroki algorytmu mogą rosnąć wolniej niż n? Dobrym tego przykładem są wyszukiwania binarne. Rozważmy algorytm wyszukiwania liczby w tablicy unikalnych wartości.

  • Zaczniemy od tablicy do przeszukania w kolejności od najmniejszej do największej.
  • Następnie sprawdzimy wartość w środku tablicy.
  • Jeśli Twoja liczba jest wyższa, z naszego wyszukiwania pominiemy niższe liczby, a jeśli liczba była niższa, wykluczymy wyższe liczby.
  • Teraz przyjrzymy się środkowej liczbie pozostałych liczb.
  • Ponownie wykluczymy połowę liczb na podstawie tego, czy nasza wartość docelowa jest wyższa czy niższa od wartości środkowej.
  • Będziemy kontynuować ten proces, dopóki nie znajdziemy naszego celu lub ustalimy, że nie ma go na liście.

Jak widać, ponieważ wyszukiwania binarne eliminują połowę możliwych wartości w każdym przejściu, wraz ze wzrostem n, wpływ na liczbę sprawdzania tablicy jest prawie nienaruszony. Aby wyrazić to w notacji Big-O, napisalibyśmy:

O(log(n))

Znaczenie notacji Big-O

Big-O nation daje Ci szybki i łatwy sposób komunikowania, jak wydajny jest algorytm. Ułatwia to wybór między różnymi algorytmami. Może to być szczególnie przydatne, jeśli używasz algorytmu z biblioteki i niekoniecznie wiesz, jak wygląda kod.

jak przekazywać wiele e-maili w programie Outlook

Kiedy po raz pierwszy uczysz się kodować, zaczynasz od funkcji liniowych. Jak widać na powyższym wykresie, zaprowadzi cię to bardzo daleko. Ale gdy stajesz się bardziej doświadczony i zaczynasz budować bardziej złożony kod, wydajność zaczyna stawać się problemem. Zrozumienie, jak określić ilościowo wydajność swojego kodu, da ci narzędzia potrzebne do rozpoczęcia dostrajania go pod kątem wydajności i rozważenia zalet i wad algorytmów.

Udział Udział Ćwierkać E-mail 10 najczęstszych błędów w programowaniu i kodowaniu

Błędy w kodowaniu mogą prowadzić do wielu problemów. Te wskazówki pomogą Ci uniknąć błędów programistycznych i zachować znaczenie kodu.

Czytaj dalej
Powiązane tematy
  • Programowanie
  • Programowanie
O autorze Jennifer Seaton(21 opublikowanych artykułów)

J. Seaton jest pisarzem naukowym, który specjalizuje się w rozwiązywaniu złożonych tematów. Posiada tytuł doktora na Uniwersytecie Saskatchewan; jej badania koncentrowały się na wykorzystaniu nauki opartej na grach w celu zwiększenia zaangażowania uczniów w Internecie. Kiedy nie pracuje, znajdziesz ją z jej czytaniem, graniem w gry wideo lub ogrodnictwem.

Więcej od Jennifer Seaton

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować