1. Asymptotická složitost

1 - Asymptotická složitost

Připomenutí teorie

Přednáška 1 v oddíle Přednášky

  • Horní (“Big-O”, Omikron): f(n)O(g(n))c>0,n0,n>n0:f(n)cg(n)f(n) \in \mathrm{O}(g(n)) \Leftrightarrow \exists c > 0, \exists n_0, \forall n > n_0: f(n) \leq c \cdot g(n)

  • Dolní (Omega): f(n)Ω(g(n))c>0,n0,n>n0:f(n)cg(n)f(n) \in \Omega(g(n)) \Leftrightarrow \exists c > 0, \exists n_0, \forall n > n_0: f(n) \geq c \cdot g(n)

  • Optimální (Theta): f(n)Θ(g(n))f(n)O(g(n))f(n)Ω(g(n))f(n) \in \Theta(g(n)) \Leftrightarrow f(n) \in \mathrm{O}(g(n)) \land f(n) \in \Omega(g(n))

Vše to jsou množiny!
Vše to jsou množiny!

Užitečná pravidla:

  • limnf(n)g(n)=0\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0, pak f(n)O(g(n))f(n) \in \mathrm{O}(g(n)), ale f(n)Θ(g(n))f(n) \notin \Theta(g(n))

  • limnf(n)g(n)=\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty, pak f(n)Ω(g(n))f(n) \in \Omega(g(n)), ale f(n)Θ(g(n))f(n) \notin \Theta(g(n))

  • limnf(n)g(n)=a,a(0,)\lim_{n \to \infty} \frac{f(n)}{g(n)} = a, a \in (0, \infty), pak f(n)Θ(g(n))f(n) \in \Theta(g(n))

  • Na základu logaritmu nezáleží

  • Při součtu 2 funkcí stačí ta, která je asymptoticky rychleji rostoucí, neboli Θ(f(n)+g(n))=Θ(max(f(n),g(n)))\Theta(f(n) + g(n)) = \Theta(max(f(n), g(n))).

Řešené úlohy

Rozehřání

Řešená úloha 1: Který fragment programu z následujících dvou proběhne rychleji? (Předpokládáme, že oba běží v identickém SW/HW prostředí.)

int n = 100;
int sum = 0;
for (i = 0; i < n; i++)
  for (j = 0; j < i; j++)
    sum += i+j;
int n = 75;
int sum = 0;
for (i = 0; i < n; i++)
  for (j = 0; j < n; j++)
    sum += i+j;
Řešení

Ten nalevo, protože i=099i=100992=4950<5625=752\sum_{i=0}^{99} i = 100\frac{99}{2} = 4950 < 5625 = 75^2

Vyplatí se znát vzorec pro součet qq členů aritmetické posloupnosti: i=1qai=qa1+aq2\sum_{i = 1}^{q} a_i = q \frac{a_1 + a_q}{2}. Vizuální důkaz.


Řešená úloha 2: Ke zpracování kk-tého řádku matice velikosti n×nn \times n je zapotřebí 2k2k operací. Kolik je potřeba operací ke zpracování celé matice?

a) 2n22n^2
b) n2/2n^2 / 2
c) n(n+1)/2n(n+1) / 2
d) n(n1)n(n-1)
e) n(n+1)n(n+1)

Řešení

Správně je e): Součet pro nn řádků (aritmetická posloupnost): k=1n2k=n2+2n2=n(n+1)\sum_{k=1}^n 2k = n\frac{2 + 2n}{2} = n(n+1).


Řešená úloha 3: Metoda A potřebuje k vyřešení úlohy n2+17n^2 + 17 operací, Metoda B potřebuje 2n+802n + 80 operací, přičemž celé číslo nn popisuje rozsah vstupních dat. Pro jaká nn je výhodnější použít metodu A?

Řešení

Matematický pohled

Řešená úloha 4: Pro rostoucí spojité fukce ff, gg platí f(x)Ω(g(x))f(x) \in \Omega(g(x)). Z toho plyne, že:

  1. f(x)O(g(x))f(x) \in \mathrm{O}(g(x))

  2. f(x)Θ(g(x))f(x) \in \Theta(g(x))

  3. g(x)Θ(f(x))g(x) \in \Theta(f(x))

  4. g(x)Ω(f(x))g(x) \in \Omega(f(x))

  5. g(x)O(f(x))g(x) \in \mathrm{O}(f(x))

Řešení

e): g(x)O(f(x))g(x) \in \mathrm{O}(f(x)) ověříme snadno z definice.


Řešená úloha 5: Pro dvě spojité funkce ff, gg rostoucí na celém R\mathbb{R} platí f(x)<g(x)f(x) < g(x) pro každé xRx \in \mathbb{R}. Je možné, že f(x)Ω(g(x))f(x) \in \Omega(g(x))?

Řešení

Ano, například f(x)=xf(x) = x a g(x)=x+1g(x) = x + 1.


Řešená úloha 6: Uveďte příklad tří rostoucích funkcí reálné proměnné f(x)f(x), g(x)g(x) a h(x)h(x), pro které současně platí všechny tři následující vztahy.

  • f(x)O(g(x))f(x) \notin \mathrm{O}(g(x))

  • g(x)Θ(h(x))g(x) \notin \Theta(h(x))

  • h(x)Ω(f(x))h(x) \notin \Omega(f(x))

Pokud taková trojice funkcí nemůže existovat, zdůvodněte proč.

Řešení

Může, například f(x)=x3,g(x)=x2,h(x)=xf(x) = x^3, g(x) = x^2, h(x) = x


Řešená úloha 7: Seřaďte následující funkce dle asymptotické složistosti, identifikujte asymptoticky ekvivalentní funkce.

nlog2nn \log_2 n

5n5n

nnn^n

log2n\log_2 n

2n2^n

n23\sqrt[3]{n^2}

n1000n^{1000}

lnn\ln{n}

11

nlog2n+7nn \log_2 n + 7n

3n3^n

n!n!

nn

log4n\log_4 n

2log2n2^{\log_2 n}

3n+2n3^n + 2^n

Řešení
  1. 11

  2. log4n,log2n,lnn\log_4 n, \log_2 n, \ln n

  3. n23\sqrt[3]{n^2}

  4. n,5n,2log2nn, 5n, 2^{\log_2 n}

  5. nlog2n,nlog2n+7nn \log_2 n, n \log_2 n + 7n

  6. n1000n^{1000}

  7. 2n2^n

  8. 3n,3n+2n3^n, 3^n + 2^n

  9. n!n!

  10. nnn^n

Pokud si nejsme jistí, která ze dvou funkcí f(n) a g(n) má vyšší asymptotickou složitost, spočítáme limitu limnf(n)g(n)\lim_{n \to \infty} \frac{f(n)}{g(n)} pomocí L’Hospitalova pravidla.


Praktický pohled

Řešená úloha 8: Algoritmus A\mathcal{A} prochází matici o velikosti n×nn \times n a s každým prvkem provádí akci, jejíž složitost je Θ(log2(n))\Theta(\log_2(n)). Jaká je celková (optimální) asymptotická složitost algoritmu A\mathcal{A}?

Řešení

Θ(n2log2(n))\Theta(n^2 \log_2(n)), algoritmus provede n2n^2 krát operaci která má složitost Θ(log2(n))\Theta(\log_2(n)).


Řešená úloha 9: Jaká je asymptotická složitost následujícího algoritmu?

// array has size N and contains positive integers
if (array.length == 0)
  return -1;
int val = array[0];
for (int i = 1; i < N ; i++)
  if (array[i] < val)
    val = array[i];
return val;

Co je výstupem algoritmu?

Řešení

Θ(N)\Theta(N), algoritmus hledá minimum v poli


Nevyřešitelné (zatím) úlohy

Motivační úloha 10: Plánujeme bankovní loupež a chceme si z trezoru banky odnést zlato v co největší hodnotě. Banka vede různé váhy zlatých cihliček. V trezoru mají 3, 4 a 7 kilové cihličky. Za 3 kilovou cihličku dostaneme 7 milionů Kč, za 4 kilovou cihličku dostaneme 10 milionů Kč a za 7 kilovou dostaneme 16 milionů Kč. Víme, že uneseme 185 kg zlata, které cihličky máme vzít, abychom si z banky odnesly cihličky v co největší hodnotě?

Motivační úloha 11: Sestavujeme nový nákladní vlak a máme k dispozici tři druhy nákladních vozů: Kontejnerový vůz, výsypný vůz a cisterna. Z bezpečnostích důvodů nesmí být dvě cisterny bezprostředně za sebou. Kolik různých vlaků s 10 vozy můžeme sestavit?

Motivační úloha 12: Připravujeme velkou databázi uživatelů a víme, že nejčastěji budeme vyhledávat podle sloupce "Příjmení". Chtěli bychom tedy indexovat tento sloupec. Jakou datovou strukturu bychom měli použít?

Další úlohy

Úloha 13: Stroj provádí 10910^9 operací za sekundu. Pro výpočet je k dispozici 1 hodina. Určete, jaká může být maximální hodnota NmaxN_{\max}, která určuje velikost vstupních dat, v případě že počet nezbytných operací pro zpracování dat o velikosti NN je N3/2N^{3/2}.

A co v případě že zpracování vyžaduje
a) N5/4N^{5/4} operací
b) Nlog2(N)log2(log2N)N \cdot \log_2(N) \cdot \log_2 (\log_2 N) operací
c) N2log2NN^2 \cdot \log_2 N operací


Úloha 14: Ukažte, že Θ(logan)\Theta(\log_a n) a Θ(logbn)\Theta(\log_b n) jsou stejné množiny. (Za předpokladu, že aa i bb jsou kladná čísla)


Úloha 15: Ukažte, že Θ(f(n)+g(n))\Theta(f(n) + g(n)) a Θ(max(f(n),g(n)))\Theta(max(f(n), g(n))) jsou stejné množiny.


Úloha 16: Pro rostoucí spojité fukce ff, gg platí f(x)O(g(x))f(x) \in \mathrm{O}(g(x)). Z toho plyne které z následujících tvrzení?

  1. f(x)Θ(g(x))f(x) \in \Theta(g(x))

  2. f(x)Ω(g(x))f(x) \in \Omega(g(x))

  3. g(x)Θ(f(x))g(x) \in \Theta(f(x))

  4. g(x)Ω(f(x))g(x) \in \Omega(f(x))

  5. g(x)O(f(x))g(x) \in \mathrm{O}(f(x))


Úloha 17: Pro dvě spojité funkce ff, gg rostoucí na celém R\mathbb{R} platí f(x)Ω(g(x))f(x) \notin \Omega(g(x)), f(x)Θ(g(x))f(x) \notin \Theta(g(x)). Jsou následující tvrzení pravdivé?

a) g(x)O(f(x))g(x) \in \mathrm{O}(f(x))
b) g(x)Θ(f(x))g(x) \in \Theta(f(x))
c) f(x)<g(x)f(x) < g(x) pro každé xRx \in \mathbb{R}
d) f(x)g(x)f(x) \leq g(x) pro každé xRx \in \mathbb{R}
e) může existovat yRy \in \mathbb{R} takové, že f(y)>g(y)f(y) > g(y)


Úloha 18: Který z následujících výroků je nepravdivý?

a) xlog2(x)O(x2x)x\log_2(x) \in \mathrm{O}(x^2 - x)
b) xlog2(x)O(x2log2(x))x\log_2(x) \in \mathrm{O}(x^2 - \log_2(x))
c) xlog2(x)Ω(x2log2(x))x\log_2(x) \in \Omega(x^2 - \log_2(x))
d) xlog2(x)Ω(x+log2(x))x\log_2(x) \in \Omega(x + \log_2(x))
e) xlog2(x)Θ(xlog2(x2))x\log_2(x) \in \Theta(x \log_2(x^2))


Úloha 19: Uveďte příklad tří rostoucích funkcí reálné proměnné f(x)f(x), g(x)g(x) a h(x)h(x), pro které současně platí všechny tři následující vztahy.

  • f(x)O(g(x))f(x) \notin \mathrm{O}(g(x))

  • g(x)Ω(h(x))g(x) \notin \Omega(h(x))

  • h(x)Θ(f(x))h(x) \notin \Theta(f(x))

Pokud taková trojice funkcí nemůže existovat, zdůvodněte proč.


Úloha 20: Algoritmus A\mathcal{A} prochází pole s nn prvky. Při zpracování prvku na pozici kk provede k+nk+n operací. Jaká je asymptotická složitost algoritmu A\mathcal{A}?


Úloha 21: Matice A má MM řádků a NN sloupců indexovaných od 00. Na zpracování prvku matice na pozici [r][s][r][s], (0r<M,0s<N0 \le r < M, 0 \le s < N) je zapotřebí právě s+rs + r operací, z nichž každá má konstantní složitost. Jaká je asymptotická složitost zpracování celé matice?


Úloha 22: Je dána zafixovaná matice M o rozměru N×NN \times N. Máme postupně odpovídat na množství dotazů stejného formátu:

Jaký je součet všech hodnot v podmatici, která má levý horní roh na pozici (i1,j1)(i_1, j_1) a pravý dolní roh na pozici (i2,j2)(i_2, j_2)?

Hodnoty i1,j1,i2,j2i_1, j_1, i_2, j_2 budou v každém dotazu obecně jiné. K dispozici máte paměťový prostor stejně velký jako zabírá M. Určete, jaké hodnoty si musíte předpočítat, abyste na každý dotaz odpověděli v co nejkratším čase a nezávisle na velikosti hodnot i1,j1,i2,j2i_1, j_1, i_2, j_2.


Úloha 23: Jaká je asymptotická složitost následujícího algoritmu v závislosti na N?

int [] a = new int [N];
for (i = 0; i < N; i++)
  a[i] = N;
for (i = 0; i < N; i++)
  while (a[i] > 0) {
    print (a[i]);
    a[i] = a[i] / 2 ; // integer division
  }

Co v případě, že pole nenaplníme NN ale ii, neboli řádek 3 bude vypadat a[i] = i;?


Úloha 24: Jaká je asymptotická složitost následujícího algoritmu v závislosti na N?

int [] a = new int [N];
for (i = 0; i < N; i++)
  a[i] = 1;
for (i = 1; i < N; i++)
  while (a[i] <= 2*a[i-1]) {
    print (a[i]);
    a[i] = a[i] + 1;
  }

Úloha 25: Jaká je asymptotická složitost následujícího algoritmu?

for (int i = 0; i < N - 1 ; i++)
  for (int j = 0; j < N - i - 1 ; j++)
    if (array[j] < array[j + 1]) {
      int tmp = array[j] ;
      array[j] = array[j + 1] ;
      array[j+1] = tmp ;
    }

Co provádí tento algoritmus?


Úloha 26: Na obvodu kružnice jsou v libovolně nepravidelných intervalech vyznačeny body očíslované po řadě za sebou 1, 2, …, N. Máme určit počet všech takových trojúhelníků, jejichž vrcholy leží v očíslovaných bodech a které neobsahují střed kružnice jako svůj vnitřní bod.

Navrhněte algoritmus a určete jeho asymptotickou složitost.

(Řešte analogickou úlohu pro konvexní čtyřúhelníky.)


Úloha 27: Na výstup máme vypsat všechna kladná celá čísla, která jsou menší než dané číslo N a která ve svém binárním zápisu obsahují právě 3 jedničky.

Jaký bude asymptotická složitost efektivního algoritmu? Algoritmus lineární vůči N je neefektivní.


Úloha 28: Popište, jak vypočtete hodnotu log10(log10NN!)log_{10}(log_{10} N^{N!}) pro N=107N = 10^7. Nepoužívejte aproximace jako např. Stirlingův vzorec apod.

Jak dlouho bude trvat výpočet na Vašem osobním počítači?


Řešení k posledním 3 úlohám je popsané zde.

Je na stránce chyba?

Nahlašte nám ji

Máte otázky nebo připomínky?

Edit Dejte nám vědět