Temat niniejszego artykułu z algorytmiki: notacja dużego O. Przedstawię Ci na czym ona polega i jak interpretować wzory, na jakie natrafisz 🧠. Jeżeli już teraz głowisz się już nad samym hasłem, to wchodź, a nie pożałujesz 😊!
NOTACJA DUŻEGO O POKAŻE CI EFEKTYWNOŚĆ ALGORYTMU POD KĄTEM CZASU I PAMIĘCI
Pojęcie może budzić zdziwienie przez swoją nazwę 🙂. To jest miara efektywności algorytmu. Notacja dużego O pozwala na opisanie asymptotycznego stopnia wzrostu czasu (lub komórek pamięci) względem rozmiaru danych, jakie zostaną podane algorytmowi ℹ️.
Jednym z najważniejszych czynników algorytmu jaki powinien Cię interesować podczas brania go pod uwagę jest to, ile czasu i pamięci będzie potrzebował na dostarczenie rozwiązania problemu ⚠️. W artykule wprowadzającym kategorię algorytmiki, napisałem że to jest również sztuka badania ich efektywności 🔍. 2 najbardziej podstawowe kryteria, jakie musisz uwzględnić w każdym algorytmie, to 👇:
- czas (a konkretniej, to jak szybko on rośnie zależnie od rozmiaru danych),
- pamięć (konkretniej, liczba komórek pamięci jaka rośnie zależnie od rozmiaru danych).
Nie bez znaczenia podkreślam "zależnie od rozmiaru danych". Notacja dużego O pozwala nam zmierzyć czas działania określonego algorytmu bądź ile komórek pamięci będzie potrzebował na podstawie liczby operacji do wykonania wraz z rosnącym rozmiarem danych wejściowych 😲! Tego nie mierzysz w milisekundach czy w innej metryce czasowej ❌! To jest definiowane jako tempo wzrostu 📈.
PRZYPADEK NAJGORSZY
Należy wspomnieć, że notacja dużego O opisuje złożoność czasową i pamięciową w przypadku najgorszym ℹ️. Najgorszy czyli taki, którego liczba wykonanych operacji osiągnęła maksimum opisywane przez tę notację.
Przykładowo, wyszukiwanie binarne charakteryzuje się taką złożonością czasową (pamięciowa jest inna ⚠️!) 👇:
O(log(n))
co oznacza, że dla tablicy (lub listy) mającej 100 elementów, w najgorszym przypadku wykona się 7 iteracji celem znalezienia rozwiązania ✅:
log2(100) ≈ 7
Jednak to wcale nie znaczy, że zawsze będzie tyle 💥! Rozwiązanie może zostać znalezione już za pierwszym razem i może wystarczyć zaledwie jedna iteracja (1 < 7) 1️⃣. Mówimy wtedy o przypadku optymistycznym 😊.
Notacja dużego O jest tylko jedną z kilku istniejących metryk opisujących efektywność algorytmu na obu płaszczyznach (czas i pamięć), która "stoi" obok innych znanych notacji 👇:
- notacja "omega" (opis złożoności czasowej/pamięciowej w przypadku optymistycznym),
- notacja "theta" (opis złożoności czasowej/pamięciowej w przypadku średnim),
- notacja dużego O (opis złożoności czasowej/pamięciowej w przypadku najgorszym).
NAJCZĘŚCIEJ WYSTĘPUJĄCE RODZAJE METRYK
Możesz natrafić na różnorakie metryki, bo każdy algorytm jest zbudowany inaczej i ma różne swoje wady oraz zalety, jednak kilka z nich można wyróżnić jako "najczęściej spotykane". Przyjrzyj się tej tabelce 👇:
| NOTACJA | ZNACZENIE | OPIS | PRZYKŁAD |
| O(1) | wzrost stały | algorytm wykonuje tylko jedną instrukcję celem znalezienia rozwiązania | pobranie elementu z tablicy po podaniu indeksu |
| O(log(n)) | wzrost logarytmiczny | algorytm w najgorszym przypadku wykonuje tylko log2(n) instrukcji celem znalezienia rozwiązania | wyszukiwanie binarne |
| O(n*log(n)) | wzrost pseudowielomianowy | algorytm w najgorszym przypadku wykonuje n*log2(n) instrukcji celem znalezienia rozwiązania | sortowanie przez scalanie |
| O(n2) | wzrost kwadratowy | algorytm w najgorszym przypadku wykonuje n2 instrukcji celem znalezienia rozwiązania | sortowanie przez wybieranie |
| O(n!) | wzrost wykładniczy | algorytm w najgorszym przypadku wykonuje aż n! ("n silnia") instrukcji celem znalezienia rozwiązania | problem komiwojażera |
Pamiętaj, że algorytm może przyjmować własne bardzo rzadko spotykane formy, jak na przykład:
O(⌊√n⌋*log(n))
Podłoga z pierwiastka z N przemnożona przez logarytm z N przy podstawie 2 😏.
![]() |
Notacja dużego O jest matematyczną miarą tempa wzrostu złożoności obliczeniowej (czasowej) lub pamięciowej wraz z rosnącym rozmiarem danych wejściowych. Im mniejszy wzrost, tym lepiej.
Dotarliśmy do mety 😅. Notacja dużego O może być naprawdę decydująca w wyborze odpowiedniego algorytmu do naszych potrzeb projektowych 💪. Trzeba jednak dobrze wgłębić się w temat z matematycznego punktu widzenia, aby w pełni zrozumieć to zagadnienie 💥.
