Notacja Big Oh (O, Theta, Omega) dotyczy tempa wzrostu funkcji.
Kiedy implementujesz algorytm, ma on pewną cechę, jak zmienia się środowisko wykonawcze, gdy zwiększasz zestaw danych. Teraz możesz zoptymalizować algorytm, aby działał szybciej o współczynnik 100. Jasne, to świetnie, ale w zasadzie nadal jest to ten sam algorytm. Podobnie za kilka lat komputery mogą być dwa razy szybsze niż obecnie.
Notacja Landaua wyodrębnia te stałe czynniki. Nie ma znaczenia, czy algorytm f
jest zawsze dwa razy szybszy niż inny algorytm g
: być g
może można go zoptymalizować tak, aby działał 4 razy szybciej, lub zamiast tego można kupić szybszy sprzęt. Jeśli spojrzysz na to z tej perspektywy, możesz powiedzieć, że są „takie same”. (Nie oznacza to, że możesz (zawsze) ignorować stałe czynniki w praktyce.)
Big oh określa górną granicę, jest podobna do <=
relacji.
Zgodzisz się, że 1 < 2
to prawda. Czy to oznacza, że 1
nie może być mniejsza niż jakakolwiek inna liczba? Zdecydowanie nie. Istnieje nieskończona ilość liczb, które są większe niż 1
.
Przy stopach wzrostu jest podobnie. O(n)
oznacza zestaw wszystkich funkcji, które rosną liniowo (lub wolniej). O(n^2)
z drugiej strony oznacza wszystkie te funkcje, które rosną z kwadratową kompelacją (lub wolniej). Jestem pewien, że zgodzicie się, że funkcja liniowa rośnie wolniej niż funkcja kwadratowa.
Dlatego funkcja może należeć do więcej niż jednej klasy „Big-oh”.
Oto porównanie różnych funkcji z : (z konkretnej matematyki Knutha)
Od lewej do prawej funkcje rosną szybciej.
Oznacza to również, że n ^ 2 rośnie szybciej niż n ^ 1, ponieważ 2> 1.
Definicje
„f rośnie szybciej lub równie szybko jak g”
„f rośnie wolniej lub równie szybko jak g”
Połączenie dwóch powyższych. Mówi, że funkcja f
rośnie „równie szybko” jak g
. To relacja równoważności.
Interpretacja
Powiedzmy, że masz dwa algorytmy f
i g
.
Omega
Zakładając , oznacza to, że bez względu na budżet nie ma stałej mocy obliczeniowej, którą można by dodać do systemu, tak aby f
zawsze działał tak szybko, jak g
.
Wielkie och
Zakładając , oznacza to, że jeśli masz wystarczającą ilość danych, f
zawsze będzie działać szybciej g
, bez względu na to, ile mocy obliczeniowej dodasz do swojego systemu.
Dowód
Jeśli naprawdę próbujesz to udowodnić, musisz pokazać, używając definicji notacji Landaua, że twoja funkcja spełnia niezbędne warunki.
Więc trzeba znaleźć wartości c
, d
, n_0
takie, że warunek jest spełniony.
Oto jak możesz to zrobić dla dolnej granicy za pomocą c
:
Ważne jest, aby zdać sobie sprawę, że sam arbitralnie określam, c
że jest mniejszy niż a-1
jest w porządku. Definicja Theta (g) mówi, że „istnieje c
”. Może to być dowolna wartość, o ile jest większa niż 0. (Jeśli a
jest to dodatnia liczba rzeczywista, należy jednak nieco zmienić dowód, ponieważ a - 1
może być faktycznie ujemny)
(Zakładam, że jestem a
dodatni, w przeciwnym razie funkcja będzie zawsze ujemna dla dużych wartości n
, co nie ma sensu dla funkcji oznaczającej środowisko uruchomieniowe).
Możesz spróbować zrobić to dla górnej granicy, jest dość podobny. Jeśli nie wiesz jak, mogę przedstawić Ci dowód.
Wskazówka: zacznij od d > a + 1
Uwaga
Ważne jest, aby nie udowodnić tego w niewłaściwy sposób. Jeśli założysz, że (an + b) jest w O (n) i stamtąd odejdziesz, nie udowodniłeś, czego chciałeś. Musisz sprawdzić, czy wszystkie twoje kroki idą w obie strony, tzn. Zamiast =>
tego <=>
.