Notacja O (wielkie O) przedstawia pesymistyczne oszacowanie złożoności algorytmu, co oznacza, że określa górną granicę czasu wykonania. To oznacza, że w najgorszym scenariuszu czas wykonania algorytmu nie przekroczy wartości określonej przez notację O dla dużych rozmiarów danych wejściowych.
Podstawowe Klasy Złożoności
-
O(1) - Stała złożoność czasowa
- Czas wykonania algorytmu jest niezależny od rozmiaru danych wejściowych.
-
Przykład: Dostęp do elementu w tablicy.
-
O(log n) - Logarytmiczna złożoność czasowa
- Czas wykonania algorytmu rośnie logarytmicznie wraz z rozmiarem danych wejściowych.
-
Przykład: Wyszukiwanie binarne.
-
O(n) - Liniowa złożoność czasowa
- Czas wykonania algorytmu rośnie liniowo wraz z rozmiarem danych wejściowych.
-
Przykład: Przeszukiwanie nieposortowanej listy.
-
O(n log n) - Liniowo-logarytmiczna złożoność czasowa
- Czas wykonania algorytmu rośnie w tempie n log n.
-
Przykład: Sortowanie przez scalanie (Merge Sort).
-
O(n^2) - Kwadratowa złożoność czasowa
- Czas wykonania algorytmu rośnie kwadratowo wraz z rozmiarem danych wejściowych.
-
Przykład: Sortowanie bąbelkowe (Bubble Sort).
-
O(n^3) - Sześcienna złożoność czasowa
- Czas wykonania algorytmu rośnie sześciennie wraz z rozmiarem danych wejściowych.
-
Przykład: Algorytmy przetwarzania grafów, takie jak algorytm Floyda-Warshalla.
-
O(2^n) - Eksponencjalna złożoność czasowa
- Czas wykonania algorytmu rośnie wykładniczo wraz z rozmiarem danych wejściowych.
-
Przykład: Algorytmy przeszukiwania przestrzeni stanów, takie jak problem komiwojażera.
-
O(n!) - Silnia
- Czas wykonania algorytmu rośnie silniowo wraz z rozmiarem danych wejściowych.
-
Przykład: Algorytmy generujące wszystkie permutacje zbioru.
Podsumowanie
Zrozumienie różnych klas złożoności opisanych za pomocą notacji O jest kluczowe dla oceny i porównywania wydajności algorytmów. Wybór odpowiedniego algorytmu może znacząco wpłynąć na efektywność rozwiązania problemu, szczególnie w przypadku dużych zbiorów danych.