Analiza algorytmów

Sprzątanie Wikipedii
Ten artykuł należy dopracować:
patrz dyskusja.
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.

Analiza algorytmu to sposób określenia zasobów, które są potrzebne w celu wykonania algorytmu: ilości czasu i miejsca w pamięci, szerokości pasma lub liczby układów logicznych.

W analizie algorytmu czas działania algorytmu spełnia ważną rolę, ponieważ niektóre proste problemy mogą powodować niezwykle długie obliczenia.

W analizie tej rozważa się przypadek najdłuższego czasu działania dla każdych danych wejściowych określonego rozmiaru oraz przypadek średniego czasu oczekiwania na działania danego algorytmu przy założeniu, iż wszystkie dane wejściowe określonego rozmiaru są jednakowo prawdopodobne.

Od czego zależy czas wykonywania

  1. od danych wejściowych (ciąg posortowany jest łatwiejszy do posortowania),
  2. od wielkości strumienia wejściowego (ciąg krótszy jest łatwiejszy do posortowania).

Zwykle szukamy górnych granic czasu działania, żeby mieć gwarancję nieprzekroczenia go.

Rodzaje analizy

  1. Najgorszy przypadek (zwykle): T ( n ) = {\displaystyle T(n)=} maksymalny czas działania algorytmu na danych wielkości n.
  2. Średni przypadek (czasami): Oczekiwany czas działania przy każdych danych (wymaga założeń co do statystycznego rozłożenia danych).
  3. Najlepszy przypadek (fałszywa analiza): Pokazuje, że nawet wolny algorytm pracuje szybko dla pewnych danych.

Notacja asymptotyczna

Zasugerowano, aby zintegrować ten artykuł z artykułem asymptotyczne tempo wzrostu (dyskusja). Nie opisano powodu propozycji integracji.
 Osobny artykuł: asymptotyczne tempo wzrostu.
  • ignoruje stałe zależne od komputera (dzięki temu analiza jest uniwersalna, uzyskujemy te same wyniki niezależnie od maszyny),
  • zwraca uwagę na wzrost funkcji T ( n ) . {\displaystyle T(n)\to \infty .}

Notacja O (górna granica)

O ( g ( n ) ) = { f ( n ) : {\displaystyle O(g(n))=\{f(n){:}} istnieją stałe c > 0 , n 0 > 0 {\displaystyle c>0,n_{0}>0} takie, że 0 f ( n ) c g ( n ) {\displaystyle 0\leqslant f(n)\leqslant cg(n)} dla wszystkich n n 0 } . {\displaystyle n\geqslant n_{0}\}.}

Przykład:

2 n 2 = O ( n 3 ) , g d z i e ( c = 1 , n 0 = 2 ) . {\displaystyle 2n^{2}=O(n^{3}),gdzie(c=1,n_{0}=2).}

Zwróć uwagę, że n 2 , n 3 {\displaystyle n^{2},n^{3}} to funkcje, nie wartości. Ponadto równość jest „w jedną stronę”!

(Dokładniej operując na zbiorach powinno się pisać 2 n 2 O ( n 3 ) , {\displaystyle 2n^{2}\in O(n^{3}),} więc, np. O ( n 2 ) {\displaystyle O(n^{2})} jest zbiorem funkcji i we wzorach traktuje się ten zbiór jako anonimową funkcję h ( n ) O ( n 2 . {\displaystyle h(n)\in O(n^{2}.} )

Notacja Ω {\displaystyle \Omega } (ograniczenie dolne)

Ω ( g ( n ) ) = { f ( n ) : {\displaystyle \Omega (g(n))=\{f(n){:}} istnieją stałe c > 0 , n 0 > 0 {\displaystyle c>0,n_{0}>0} takie, że 0 c g ( n ) f ( n ) {\displaystyle 0\leqslant cg(n)\leqslant f(n)} dla wszystkich n n 0 } . {\displaystyle n\geqslant n_{0}\}.}

Przykład:

n = Ω ( l g n ) , {\displaystyle {\sqrt {n}}=\Omega (lgn),} gdzie c = 1 , n 0 = 16. {\displaystyle c=1,n_{0}=16.}

Notacja Θ {\displaystyle \Theta } (tight bounds)

Θ ( g ( n ) ) = { f ( n ) : {\displaystyle \Theta (g(n))=\{f(n){:}} istnieją dodatnie stałe c 1 , c 2 , n 0 {\displaystyle c_{1},c_{2},n_{0}} takie, że 0 c 1 g ( n ) f ( n ) c 2 g ( n ) {\displaystyle 0\leqslant c_{1}g(n)\leqslant f(n)\leqslant c_{2}g(n)} dla wszystkich n n 0 } , {\displaystyle n\geqslant n_{0}\},}

lub inaczej:

Θ ( g ( n ) ) = O ( g ( n ) ) Ω ( g ( n ) ) . {\displaystyle \Theta (g(n))=O(g(n))\cap \Omega (g(n)).}

Przykład:

5 n 2 3 n = Θ ( n 2 ) . {\displaystyle 5n^{2}-3n=\Theta (n^{2}).}

Notacja o (małe O)

Notacje O i Ω {\displaystyle \Omega } są jak {\displaystyle \leqslant } i . {\displaystyle \geqslant .}
Notacje o i ω {\displaystyle \omega } sa jak < {\displaystyle <} i > . {\displaystyle >.}

o ( g ( n ) ) = { f ( n ) : {\displaystyle o(g(n))=\{f(n){:}} dla każdej dodatniej stałej c > 0 {\displaystyle c>0} istnieje stała n 0 > 0 {\displaystyle n_{0}>0} taka, że 0 f ( n ) < c g ( n ) {\displaystyle 0\leqslant f(n)<cg(n)} dla wszystkich n n 0 } . {\displaystyle n\geqslant n_{0}\}.}

Przykład:

2 n 2 = o ( n 3 ) {\displaystyle 2n^{2}=o(n^{3})\quad {}} i n 0 = 2 c {\displaystyle {}\quad n_{0}={\frac {2}{c}}}

Notacja ω {\displaystyle \omega }

(patrz: Notacja o)

ω ( g ( n ) ) = { f ( n ) : {\displaystyle \omega (g(n))=\{f(n){:}} dla każdej dodatniej stałej c > 0 {\displaystyle c>0} istnieje stała n 0 > 0 {\displaystyle n_{0}>0} taka, że 0 c g ( n ) < f ( n ) {\displaystyle 0\leqslant cg(n)<f(n)} dla wszystkich n n 0 } . {\displaystyle n\geqslant n_{0}\}.}

Przykład:

n = ω ( l g n ) , {\displaystyle {\sqrt {n}}=\omega (lgn),} gdzie ( n 0 = 1 + 1 / c ) . {\displaystyle (n_{0}=1+1/c).}

Zobacz też

Encyklopedia internetowa (teoria złożoności obliczeniowej):
  • Britannica: topic/analysis-of-algorithms