Podstawy analizy algorytmów: Big-O notation

Nie każdy musi być kosmonautą, niemniej warto wiedzieć że Ziemia krąży wokół Słońca a nie na odwrót. Nie każdy programista musi być asem algorytmiki mimo wszystko dobrze jest mieć chociaż podstawową wiedzę na ten temat. Zwłaszcza, że znajomość, lub chociaż umiejętność porównania algorytmów,  pozwala na pisanie wydajniejszych programów (albo chociaż poczucie pisania wydajniejszych programów 🙂 ). Dzisiaj w dobie języków wysokiego poziomu, które dysponują garbage collector’ami, mają wbudowany szereg struktur danych wykraczających daleko po za proste tablice, a IDE dla nich prawie myśli za programistę wdaje się to być szczególnie cenne, bo w tym dobrobycie można łatwo zapomnieć dlaczego wybór odpowiedniej struktury, lub algorytmu, nie powinien być dyktowany przyzwyczajeniami.

Big-O notation (notacja asymptotyczna):
Podstawą, jeżeli chodzi o analizę algorytmu, jest określenie złożoności funkcji, która ten algorytm opisuje. Im bardziej złożona funkcja – której argumentem jest liczba elementów wejściowych – tym dłuższy czas wykonywania algorytmu (na standardowe potrzeby, wystarczy jeżeli będziemy mówili o czasie, ale równie dobrze, zamiast o czas, może chodzić np.. O zasoby pamięci.)
Podstawowym narzędziem, które pozwala na opisanie (przynajmniej w teorii :)) złożoności algorytmu jest notacja asymptotyczna. Dzięki niej możemy szybko (oczywiście jeżeli znamy złożoność danych algorytmów) dokonać odpowiedniego wyboru :). Kolejną jej zaletą jest – jako że jest to po prostu funkcja – możliwość przedstawienia ją w postaci wykresu, co może być dla niektórych osób ułatwieniem, pozwalającym na przyspieszenie analizy

Notacja asymptotyczna przedstawiana jest w takiej postaci:
O(f(n)) , gdzie n to liczba danych wejściowych (np.. Elementów kolekcji, które trzeba posortować).


 

Podstawowe (najczęściej spotykane w standardowych algorytmach) złożoności:
*Podane są w kolejności od najbardziej do najmniej wydajnych.

O(c) gdzie c to stała:
O(c)
Algorytmy z taką złożonością to marzenie programistów. Jak widać z samego zapisu, złożoność pozostaje stała niezależnie od ilości danych wejściowych. Takie algorytmy zwykle są postrzegane jako najszybsze.
Przykład algorytmu: Pobieranie danych z tablicy.

O(log2n) :
O(log2n)
Algorytmy ze złożonością opisywaną przez funkcje logarytmiczne mają tym lepszą, bardziej opłacalną wydajność im zbiór danych wejściowych jest większy.
Przykład algorytmu: Wstawianie elementu do drzewa czerwono-czarnego

O(n) :
O(n)
Złożoność liniowa, czyli taka, której szybkość wzrostu jest stała.
Przykład algorytmu: Wyszukiwanie elementu na stosie.

O(nlog2n) :
O(nlog2n)
Jest to krotnośc złożoności O(log2n). Wiele algorytmów sortujących można opisać tą złożonośćią
Przykład algorytmu: algorytm quicksort.

O(n^2) :
O(n^2)
Złożoność kwadratowa. Generalnie jest zła 🙂
Przykład algorytmu: Dwie zagnieżdżone pętle for 🙂


Oczywiście jest to tylko mały wycinek informacji dotyczącej notacji asymptotycznej, nie mniej jednak mam nadzieję, że komuś się przysłuży, albo może wzbudzi zainteresowanie tematem 🙂 .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *