Rozszerzenie tematu złożoności obliczeniowej i funkcji (poza programem — informatyka). Proste sortowanie bąbelkowe wykonuje ~n² porównań, a sprytne (przez scalanie) ~n·log n — przy dużych n różnica jest ogromna (dla n=1000 to sto razy mniej operacji). Sortowanie przez scalanie opracował John von Neumann w 1945 r.
Co się właśnie stało?
Sortowanie — uporządkowanie danych rosnąco lub malejąco — to jedna z najczęstszych operacji w informatyce, a o wydajności decyduje wybór algorytmu. Zwiększyliśmy liczbę elementów do 1 000 i porównaliśmy dwie strategie: proste sortowanie bąbelkowe i sprytne sortowanie przez scalanie.
Złożoność obliczeniowa (notacja „duże O")
Złożoność opisuje, jak liczba operacji rośnie z rozmiarem danych . Proste algorytmy (bąbelkowe, przez wybieranie) porównują każdy element z każdym, więc wykonują ich rzędu:
Sprytne algorytmy — sortowanie przez scalanie (merge sort, opracowane przez Johna von Neumanna w 1945 r.) czy szybkie (quicksort) — dzięki strategii „dziel i zwyciężaj" (dziel dane na połowy, sortuj rekurencyjnie, scalaj posortowane części) osiągają:
Dlaczego to tak ogromna różnica?
Dla małych n różnica jest niewielka. Ale dla n = 1000 to ~1 000 000 operacji () kontra ~10 000 () — sto razy mniej. Posortowanie miliona elementów algorytmem wymaga bilionów operacji (godziny, a nawet dni), a — kilkudziesięciu milionów (ułamek sekundy). Wybór algorytmu decyduje o tym, czy program działa sekundy czy lata.
Fundament informatyki teoretycznej
Analiza złożoności pozwala przewidzieć, czy program da się w praktyce uruchomić, jeszcze zanim go napiszemy. To dlatego biblioteki standardowe (w Pythonie, Javie, C++) używają wewnątrz algorytmów rzędu , a nie naiwnych pętli kwadratowych.
Po co Ci to na maturze:
Sam temat złożoności leży poza podstawą programową liceum (to pogranicze matematyki i informatyki), ale logarytmy i tempo wzrostu funkcji — owszem, są. Umiejętność porównania, jak rośnie szybciej niż , to ta sama intuicja, której potrzebujesz przy zadaniach o funkcjach i ciągach.
Zapamiętaj: liczba operacji rośnie z n zgodnie ze złożonością algorytmu — bąbelkowe , scalanie — a różnica narasta gwałtownie wraz z rozmiarem danych. Dlatego dobór algorytmu, a nie szybszy komputer, decyduje o tym, co da się policzyć.
W czasie rzędu n·log n (np. sortowanie przez scalanie), znacznie szybciej niż n² (sortowanie bąbelkowe).
Opis, jak liczba operacji rośnie z rozmiarem danych n (notacja „duże O").
John von Neumann, w 1945 r. — algorytm typu „dziel i zwyciężaj" o złożoności O(n·log n).
Powiązane eksperymenty