Asymptotyczne tempo wzrostu


Asymptotyczne tempo wzrostu w encyklopedii

Z Wikipedii, wolnej encyklopedii Przejdź do nawigacji Przejdź do wyszukiwania

Asymptotyczne tempo wzrostu – miara określająca zachowanie wartości funkcji wraz ze wzrostem jej argumentów. Stosowane jest szczególnie często w teorii obliczeń, w celu opisu złożoności obliczeniowej, czyli zależności ilości potrzebnych zasobów (np. czasu lub pamięci) od rozmiaru danych wejściowych algorytmu. Asymptotyczne tempo wzrostu opisuje jak szybko dana funkcja rośnie lub maleje, abstrahując od konkretnej postaci tych zmian.

Do opisu asymptotycznego tempa wzrostu stosuje się notację dużego O {\displaystyle \mathrm {O} } (omikron; U+039F, kod HTML: Ο, Math: \Omicron) oraz jej modyfikacje, m.in. notacja Ω {\displaystyle \Omega } (omega), Θ {\displaystyle \Theta } (theta).

Notacja dużego O {\displaystyle \mathrm {O} } została zaproponowana po raz pierwszy w roku 1894 przez niemieckiego matematyka Paula Bachmanna[1]. W późniejszych latach spopularyzował ją w swoich pracach Edmund Landau, niemiecki matematyk, stąd czasem nazywana jest notacją Landaua.

Spis treści

Definicje analityczne | edytuj kod

Niech będą dane funkcje f {\displaystyle f} oraz g , {\displaystyle g,} których dziedziną jest zbiór liczb naturalnych, natomiast przeciwdziedziną zbiór liczb rzeczywistych dodatnich.

Notacja „duże O” | edytuj kod

Mówimy, że f {\displaystyle f} jest co najwyżej rzędu g , {\displaystyle g,} gdy istnieją takie stałe n 0 > 0 , {\displaystyle n_{0}>0,} oraz c > 0 , {\displaystyle c>0,} że:

n n 0 : f ( n ) c g ( n ) {\displaystyle \forall n\geqslant n_{0}:f(n)\leqslant c\cdot g(n)}

Zapis: f ( n ) O ( g ( n ) ) {\displaystyle f(n)\in \mathrm {O} (g(n))}

Określenia „złożoność co najwyżej O ( f ( n ) ) {\displaystyle \mathrm {O} (f(n))} ” i „złożoność O ( f ( n ) ) {\displaystyle \mathrm {O} (f(n))} są matematycznie równoważne.

Wersja notacji dla zachowania się funkcji w pobliżu punktu a : {\displaystyle a{:}}

f ( n ) O ( g ( n ) ) , {\displaystyle f(n)\in \mathrm {O} (g(n)),} jeżeli istnieje takie c > 0 {\displaystyle c>0} i takie δ > 0 , {\displaystyle \delta >0,} że dla każdego x {\displaystyle x} o tej własności, że | x a | < δ {\displaystyle |x-a|<\delta } zachodzi nierówność:

| f ( x ) | c | g ( x ) | . {\displaystyle |f(x)|\leqslant c\cdot |g(x)|.}

Należy zauważyć, że nie precyzuje się tu dziedziny funkcji f {\displaystyle f} i g {\displaystyle g} – zależy ona od kontekstu w jakim występują obie funkcje.

Notacja „małe o” | edytuj kod

Mówimy, że f {\displaystyle f} jest niższego rzędu niż g , {\displaystyle g,} gdy dla każdej stałej c > 0 {\displaystyle c>0} istnieje stała n 0 > 0 , {\displaystyle n_{0}>0,} że:

n n 0 : f ( n ) < c g ( n ) {\displaystyle \forall n\geqslant n_{0}:f(n)<c\cdot g(n)}

Zapis: f ( n ) o ( g ( n ) ) {\displaystyle f(n)\in \mathrm {o} (g(n))}

Notacja „Ω” | edytuj kod

Mówimy, że f {\displaystyle f} jest co najmniej rzędu g , {\displaystyle g,} gdy istnieją takie stałe n 0 > 0 , {\displaystyle n_{0}>0,} oraz c > 0 , {\displaystyle c>0,} że:

n n 0 : f ( n ) c g ( n ) {\displaystyle \forall n\geqslant n_{0}:f(n)\geqslant c\cdot g(n)}

Zapis: f ( n ) Ω ( g ( n ) ) {\displaystyle f(n)\in \Omega (g(n))}

Notacja „ω” | edytuj kod

Mówimy, że f {\displaystyle f} jest wyższego rzędu niż g , {\displaystyle g,} gdy dla każdej stałej c > 0 {\displaystyle c>0} istnieje stała n 0 > 0 , {\displaystyle n_{0}>0,} że:

n n 0 : f ( n ) > c g ( n ) {\displaystyle \forall n\geqslant n_{0}:f(n)>c\cdot g(n)}

Zapis: f ( n ) ω ( g ( n ) ) {\displaystyle f(n)\in \omega (g(n))}

Notacja „Θ” | edytuj kod

Mówimy, że f {\displaystyle f} jest dokładnie rzędu g , {\displaystyle g,} gdy istnieją takie stałe n 0 > 0 , {\displaystyle n_{0}>0,} oraz c 1 > 0 {\displaystyle c_{1}>0} i c 2 > 0 , {\displaystyle c_{2}>0,} że:

n n 0 : c 1 g ( n ) f ( n ) c 2 g ( n ) {\displaystyle \forall n\geqslant n_{0}:c_{1}\cdot g(n)\leqslant f(n)\leqslant c_{2}\cdot g(n)}

Zapis: f ( n ) Θ ( g ( n ) ) {\displaystyle f(n)\in \Theta (g(n))}

Można powiedzieć, że f ( n ) Θ ( g ( n ) ) , {\displaystyle f(n)\in \Theta (g(n)),} gdy f ( n ) {\displaystyle f(n)} jest jednocześnie rzędu O ( g ( n ) ) {\displaystyle \mathrm {O} (g(n))} i Ω ( g ( n ) ) . {\displaystyle \Omega (g(n)).}

Właściwości | edytuj kod

Notacja dużego O {\displaystyle \mathrm {O} } pozwala wykonywać działania na funkcjach, na przykład:

  • jeśli f ( x ) O ( r ( x ) ) {\displaystyle f(x)\in \mathrm {O} (r(x))} i g ( x ) O ( r ( x ) ) , {\displaystyle g(x)\in \mathrm {O} (r(x)),} to również f ( x ) ± g ( x ) O ( r ( x ) ) . {\displaystyle f(x)\pm g(x)\in \mathrm {O} (r(x)).}
  • przy założeniach jak poprzednio, f ( x ) g ( x ) O ( r 2 ( x ) ) {\displaystyle f(x)\cdot g(x)\in \mathrm {O} (r^{2}(x))}

Wygoda notacji dużego O {\displaystyle \mathrm {O} } widoczna jest w następującej sytuacji: jeżeli f ( x ) = 2 x 3 x 2 + 100 x , {\displaystyle f(x)=2x^{3}-x^{2}+100x,} to można napisać zarówno f ( x ) O ( x 3 ) , {\displaystyle f(x)\in \mathrm {O} (x^{3}),} jak i f ( x ) 2 x 3 + O ( x 2 ) , {\displaystyle f(x)\in 2x^{3}+\mathrm {O} (x^{2}),} czy wreszcie f ( x ) 2 x 3 x 2 + O ( x ) , {\displaystyle f(x)\in 2x^{3}-x^{2}+\mathrm {O} (x),} zależnie od wymaganej dokładności oszacowań.

Napis g ( x ) f ( x ) + O ( h ( x ) ) {\displaystyle g(x)\in f(x)+\mathrm {O} (h(x))} należy rozumieć jako g ( x ) f ( x ) O ( h ( x ) ) . {\displaystyle g(x)-f(x)\in \mathrm {O} (h(x)).}

Zależności algebraiczne O , {\displaystyle \mathrm {O} ,} o , {\displaystyle \mathrm {o} ,} Ω , {\displaystyle \Omega ,} ω , {\displaystyle \omega ,} Θ {\displaystyle \Theta } | edytuj kod

Trychotomia może nie wystąpić w żadnym przypadku (lecz może w przypadku niektórych funkcji i argumentów). Przechodniość, zwrotność, symetria, symetria transpozycyjna są zawsze prawdziwe tylko w przypadku wymienionych zależności funkcji asymptotycznie dodatnich[2].

Przechodniość:

( f ( n ) Θ ( g ( n ) ) g ( n ) Θ ( h ( n ) ) f ( n ) Θ ( h ( n ) ) {\displaystyle (f(n)\in \Theta (g(n))\land g(n)\in \Theta (h(n))\Rightarrow f(n)\in \Theta (h(n))} ( f ( n ) O ( g ( n ) ) g ( n ) O ( h ( n ) ) f ( n ) O ( h ( n ) ) {\displaystyle (f(n)\in \mathrm {O} (g(n))\land g(n)\in \mathrm {O} (h(n))\Rightarrow f(n)\in \mathrm {O} (h(n))} ( f ( n ) Ω ( g ( n ) ) g ( n ) Ω ( h ( n ) ) f ( n ) Ω ( h ( n ) ) {\displaystyle (f(n)\in \Omega (g(n))\land g(n)\in \Omega (h(n))\Rightarrow f(n)\in \Omega (h(n))} ( f ( n ) o ( g ( n ) ) g ( n ) o ( h ( n ) ) f ( n ) o ( h ( n ) ) {\displaystyle (f(n)\in \mathrm {o} (g(n))\land g(n)\in \mathrm {o} (h(n))\Rightarrow f(n)\in \mathrm {o} (h(n))} ( f ( n ) ω ( g ( n ) ) g ( n ) ω ( h ( n ) ) f ( n ) ω ( h ( n ) ) {\displaystyle (f(n)\in \omega (g(n))\land g(n)\in \omega (h(n))\Rightarrow f(n)\in \omega (h(n))}

Zwrotność:

f ( n ) Θ ( f ( n ) ) {\displaystyle f(n)\in \Theta (f(n))} f ( n ) Ω ( f ( n ) ) {\displaystyle f(n)\in \Omega (f(n))} f ( n ) O ( f ( n ) ) {\displaystyle f(n)\in \mathrm {O} (f(n))}

Symetria:

f ( n ) Θ ( g ( n ) ) g ( n ) Θ ( f ( n ) ) {\displaystyle f(n)\in \Theta (g(n))\Leftrightarrow g(n)\in \Theta (f(n))}

Symetria transpozycyjna:

f ( n ) O ( g ( n ) ) g ( n ) Ω ( f ( n ) ) {\displaystyle f(n)\in \mathrm {O} (g(n))\Leftrightarrow g(n)\in \Omega (f(n))} f ( n ) o ( g ( n ) ) g ( n ) ω ( f ( n ) ) {\displaystyle f(n)\in \mathrm {o} (g(n))\Leftrightarrow g(n)\in \omega (f(n))}

Twierdzenie | edytuj kod

Dla dowolnych dwóch funkcji f ( n ) {\displaystyle f(n)} i g ( n ) {\displaystyle g(n)} zachodzi zależność:

f ( n ) Θ ( g ( n ) ) f ( n ) O ( g ( n ) ) f ( n ) Ω ( g ( n ) ) {\displaystyle f(n)\in \Theta (g(n))\Leftrightarrow f(n)\in \mathrm {O} (g(n))\land f(n)\in \Omega (g(n))} [2]

Przykłady | edytuj kod

  • Jeżeli f ( x ) = 1000 x 50 + 2 x 2 {\displaystyle f(x)=1000x^{50}+2x^{2}} oraz g ( x ) = 0 , 0000001 x 50 + 665 x , {\displaystyle g(x)=0,0000001x^{50}+665x,} to f ( x ) O ( x 50 ) {\displaystyle f(x)\in \mathrm {O} (x^{50})} oraz g ( x ) O ( x 50 ) , {\displaystyle g(x)\in \mathrm {O} (x^{50}),} ale również g ( x ) O ( f ( x ) ) . {\displaystyle g(x)\in \mathrm {O} (f(x)).}
  • Niech S ( n ) = 1 + 2 + + n . {\displaystyle S(n)=1+2+\cdots +n.} Korzystając ze wzorów sumacyjnych: S ( n ) = n ( n + 1 ) 2 < 3 n 2 , {\displaystyle S(n)={\frac {n(n+1)}{2}}<3\cdot n^{2},} a zatem S ( n ) O ( n 2 ) . {\displaystyle S(n)\in \mathrm {O} (n^{2}).}
  • Jeżeli potrzebne jest dokładniejsze oszacowanie S ( n ) , {\displaystyle S(n),} to na podstawie tego samego wzoru sumacyjnego można napisać S ( n ) = n 2 2 + n 2 n 2 2 + O ( n ) . {\displaystyle S(n)={\frac {n^{2}}{2}}+{\frac {n}{2}}\in {\frac {n^{2}}{2}}+\mathrm {O} (n).}
  • Analogicznie można napisać, że 1 2 + 2 2 + + n 2 O ( n 3 ) . {\displaystyle 1^{2}+2^{2}+\cdots +n^{2}\in \mathrm {O} (n^{3}).}

Standardowe oszacowania | edytuj kod

W zastosowaniach szczególnie często notacja dużego O {\displaystyle \mathrm {O} } pojawia się w następujących sytuacjach:

  • f ( x ) O ( 1 ) {\displaystyle f(x)\in \mathrm {O} (1)} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona
  • f ( x ) O ( log n ) {\displaystyle f(x)\in \mathrm {O} (\log n)} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona przez funkcję logarytmiczną
  • f ( x ) O ( n ) {\displaystyle f(x)\in \mathrm {O} (n)} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona przez funkcję liniową
  • f ( x ) O ( n log n ) {\displaystyle f(x)\in \mathrm {O} (n\log n)}
  • f ( x ) O ( n k ) {\displaystyle f(x)\in \mathrm {O} (n^{k})} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona przez funkcję potęgową lub wielomian
  • f ( x ) O ( a n ) {\displaystyle f(x)\in \mathrm {O} (a^{n})} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona przez funkcję wykładniczą
  • f ( x ) O ( n ! ) {\displaystyle f(x)\in \mathrm {O} (n!)} – funkcja f ( x ) {\displaystyle f(x)} jest ograniczona przez silnię

Rząd złożoności obliczeniowej | edytuj kod

W zależności od asymptotycznego tempa wzrostu, funkcje dzieli się na rzędy złożoności obliczeniowej. Najczęściej wyróżnia się:

Zastosowanie | edytuj kod

Najczęstszym zastosowaniem asymptotycznego tempa wzrostu jest szacowanie złożoności problemów obliczeniowych, w szczególności algorytmów. Oszacowanie rzędów złożoności obliczeniowej funkcji pozwala na porównywanie ilości zasobów (np. czasu, pamięci), jakich wymagają do rozwiązania problemu opisanego określoną ilością danych wejściowych. W dużym uproszczeniu można powiedzieć, że im niższy rząd złożoności obliczeniowej algorytmu, tym będzie on wydajniejszy przy coraz większym rozmiarze problemu (np. ilości danych do algorytmu).

W praktyce na efektywność algorytmu wpływa duża ilość innych czynników, w tym szczegóły realizacji. Ponadto dla małych danych wejściowych asymptotyczne tempo wzrostu może nie oddawać zachowania funkcji – np. gdy f ( n ) = n 1000 {\displaystyle f(n)={\frac {n}{1000}}} (funkcja liniowa Θ ( n ) {\displaystyle \Theta (n)} ) i g ( n ) = log n {\displaystyle g(n)=\log n} (funkcja logarytmiczna Θ ( log n ) {\displaystyle \Theta (\log n)} ), zachodzi oszacowanie f ( n ) ω ( g ( n ) ) {\displaystyle f(n)\in \omega (g(n))} ( f ( n ) {\displaystyle f(n)} asymptotycznie rośnie szybciej niż g ( n ) {\displaystyle g(n)} , gdyż n log n {\displaystyle {\frac {n}{\log n}}\to \infty } ), ale dla n = 10 {\displaystyle n=10} wartość funkcji f {\displaystyle f} jest mniejsza niż funkcji g . {\displaystyle g.}

Istnieje również wiele sytuacji kiedy algorytm ma lepszą złożoność obliczeniową niż inne, ale nie stosuje się go, ponieważ jego przewaga w faktycznej implementacji jest widoczna dopiero dla gigantycznych (i kompletnie niepraktycznych) wielkości wejścia, lub ma inne wady (na przykład niestabilność numeryczną – porównaj algorytm Strassena). Innym powodem może być na przykład fakt, że algorytm ma lepszą złożoność czasową, ale gorszą złożoność pamięciową i vice-versa (tzw. space-time tradeoff).

Zobacz też | edytuj kod

Przypisy | edytuj kod

  1. Ronald L Graham, Donald Ervin Knuth, Oren Patashnik: Matematyka konkretna. Warszawa: Wydawnictwo Naukowe PWN, 2002, s. 489. ISBN 83-01-13906-4.
  2. a b Thomas H.T.H. Cormen Thomas H.T.H. i inni, Wprowadzenie do algorytmów, KrzysztofK. Diks i inni, Wydanie VII (I w PWN), Warszawa: PWN, 2015 .
Na podstawie artykułu: "Asymptotyczne tempo wzrostu" pochodzącego z Wikipedii
OryginałEdytujHistoria i autorzy