Bioinformatyk.eu nowy serwis o bioinformatyce i programowaniu

21 gru, 2009

Notacja asymptotyczna

Zamieszczony przez: Justi w: Matematyka

Dzisiaj będzie trochę teorii n.t. tzw. notacji asymptotycznej. jest ona używana do szacowania złożoności obliczeniowej algorytmów, dzięki czemu można w miarę dokładnie wyznaczyć takie parametry jak czas wykonywania się określonych instrukcji, rozmiar alokowanej pamięci itp. trochę na ten temat pisałam już tutaj.

Przyjmijmy, że f(n) i g(n) są funkcjami (czyli np. czas), dla n→ , oraz g(n)  jest różna od 0, n będzie parametrem wejściowym, np wielkość tablicy do przetworzenia, długość łańcucha znaków, liczba obiektów itp. Poniżej przedstawiłam część teoretyczną odnośnie najczęściej stosowanych notacji zarówno z naukach matematycznych jak i informatycznych. Na dole znajdziesz wykresy obrazujące przykładowe funkcje.

A więc zaczynamy.

Notacja O

(Czytaj „notacja duże O” lub „ograniczenie górne”)

Zapisujemy jako: f(n) = O(g(n))

Taki zapis oznacza, że f jest co najwyżej rzędu g, czyli istnieje taka stała c, że:

|f(n)| c · |g(n)|

Czyli funkcja g(n) jest ograniczeniem górnym dla f (n).

  • Jak sprawdzić, czy f(n) = O(g(n)) ?

Upewniamy się, że lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} < infty

a konkretniej

lim{n right infty}0 < delim{|}{{f(x)}/{g(x)}}{|} right a,  a <> 0″ title=”lim{n right infty}0 < delim{|}{{f(x)}/{g(x)}}{|} right a,  a <> 0″/>, o ile taka granica istnieje.<em><span style=

Przykładowy wykres:

Notacja duże O

Notacja Ω

(Czytaj „notacja duże omega” lub „ograniczenie dolne”)

Zapisujemy jako: f(n) = Ω(g(n))

Taki zapis oznacza, że f jest co najmniej rzędu g, czyli istnieje taka stała c, że:

|f(n)| ≥ c ·| g(n)|

Czyli funkcja g(n) jest ograniczeniem dolnym dla f (n).

  • Jak sprawdzić, czy f(n) = Ω(g(n)) ?

Upewniamy się, że lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} > 0″ title=”lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} > 0″/></p>
<p>a konkretniej</p>
<p><img src=Notacja duże Omega

Notacja Θ

(Czytaj „notacja kanapkowa” lub „teta”)

Zapisujemy jako: f(n) = Θ(g(n))

Taki zapis oznacza, że f jest tego samego rzędu co g, czyli istnieją takie stałe c1 i c2 że:

c1 · |g(n)| ≤ |f(n)| c2 · |g(n)|

Czyli funkcja g(n) jest ograniczeniem górnym dla f (n).

  • Jak sprawdzić, czy f(n) = Θ(g(n)) ?

Upewniamy się, że lim{n right infty}0 < delim{|}{{f(x)}/{g(x)}}{|} < infty lub konkretniej lim{n right infty}0 < delim{|}{{f(x)}/{g(x)}}{|} right c,  c <> 0″ title=”lim{n right infty}0 < delim{|}{{f(x)}/{g(x)}}{|} right c,  c <> 0″/>, o ile taka granica istnieje. Przykładowy wykres:</p>
<p><span style=Notacja kanapkowa, theta

Notacja o

(Czytaj „notacja małe o”)

Zapisujemy jako: f(n) = o(g(n))

Taki zapis oznacza, że f jest rzędu mniejszego niż rząd g, czyli istnieje taka stała c, że:

|f(n)| < c · |g(n)|

  • Jak sprawdzić, czy f(n) = o(g(n)) ?

Upewniamy się, że lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} right 0 (o ile granica istnieje)

Notacja ω

(Czytaj „notacja małe omega”)

Zapisujemy jako: f(n) = o(g(n))

Taki zapis oznacza, że f jest rzędu większego niż rząd g, czyli istnieje taka stała c, że:

|f(n)| > c · |g(n)|

  • Jak sprawdzić, czy f(n) = o(g(n)) ?

Upewniamy się, że lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} right infty (o ile granica istnieje)

Notacja ~

(Czytaj „notacja falka”)

Zapisujemy jako: f(n) ~ g(n)

Taki zapis oznacza, że nie tylko f jest rzędu równego co g, ale też, że f bardzo przypomina g.

  • Jak sprawdzić, czy f(n) ~ g(n) ?

Upewniamy się, że lim{n right infty}delim{|}{{f(x)}/{g(x)}}{|} right 1

Wszystkie 5 najważniejszych notacji można przedstawić na schemacie:

Schemat obrazujący notacje na przykładzie zbiorów

Funkcje można uszeregować zgodnie ze wzrastającą złożonością:

f(n) = O(1) – funkcja f(n) jest ograniczona przez funkcję stałą
f(n) = O(log n) – funkcja f(n) jest ograniczona przez funkcję logarytmiczną

f(n) = O(√n)

f(n) = O(log2 n)
f(n) = O(n) – funkcja f(n) jest ograniczona przez funkcję liniową
f(n) = O(n log n)
f(n) = O(nk) – funkcja f(n) jest ograniczona przez funkcję potęgową lub wielomian
f(n) = O(an) – funkcja f(n) jest ograniczona przez funkcję wykładniczą
f(n) = O(n!) – funkcja f(n) jest ograniczona przez silnię

f(n) = O(nn) – funkcja f(n) jest ograniczona przez funkcję potęgowo-wykładniczą

A oto przykładowe wykresy dla zrozumienia o czym mowa.

Dla obliczeń zastosowałam podstawę logarytmu = 2.

Wykresy funkcji

Zwróć uwagę, że funkcje √n i log(n) dla niewielkich n przyjmują prawie identyczne wartości. Jednak rząd funkcji √n jest większy od logarytmicznej. Podobną sytuację mamy dla funkcji liniowej n oraz log2n (log(n)*log(n)).

Z racji odmiennej skali przyjmowanych wartości postanowiłam umieścić 3 ostatnie funkcje na osobnym wykresie:

Wykresy cd

Jak widzisz, dla stosunkowo niewielkich n, wartości funkcji wyrażają się w milionach. Funkcja nn to funkcja o najwyższej urzędowości jaką udało mi się znaleźć.  Oczywiście można by rozważyć taki twór jak n!n! ale nie wiem, czy spotyka się go w realnych zastosowaniach informatycznych.

Autorem artykułu jest Justi

3 odpowiedzi na "Notacja asymptotyczna"

1 | fred

21. Grudzień 2009 o 01:08

Avatar

bardzo przejrzyste… początkowo ciężko, ale te piękne wykresy wyjaśniają wszystko ;) good job!

2 | Rafał

21. Grudzień 2009 o 20:10

Avatar

Bardzo fajny artykuł. Podoba mi się w szczególności schemat obrazujący obszary obejmowane przez poszczególne notacje. Mam jednak pewną praktyczną uwagę co do rzeczywistego zastosowania tego typu analiz. Są dość mocno teoretyczne i nie jest oczywistym przejście od złożoności do wydajności czy zużycia zasobów (pamięć, czas procesora, etc). Determinantem jest tutaj doświadczenie i wiedza programisty oraz język programowania z konkretną implementacją użytych bibliotek. Języki mogą wspierać określone formy przetwarzania danych, a kompilatory mogą (i nie rzadko to robią) optymalizować kod.

pozdrowerek dla wszystkich czytelników

3 | Dobiatowski!

12. Lipiec 2010 o 22:05

Avatar

Co do n!^n! proponuje konkurs na utworzenie algorytmu o takiej złożoności.

lekko myśląc wydaje mi się, że odpowiednia rekurencja powinna sprostać wyzwaniu :)

co wy na to :)

Formularz komentarza

Bioinformatyk.eu na Facebook'u

Ciekawa literatura

Reklama

Linki

O serwisie


Dynamiczny serwis tworzony przez studentów, dla studentów, który chcą dowiedzieć się czym jest i zajmuje się bioinformatyka. Naszym głównym celem jest zaopatrzenie Ciebie w niezbędną wiedzę, potrzebną do wypłynięcia w rozwijający się świat bioinformatyczny!