1 - Asymptotická složitost
Připomenutí teorie
Přednáška 1 v oddíle Přednášky
-
Horní (“Big-O”, Omikron):
-
Dolní (Omega):
-
Optimální (Theta):

Užitečná pravidla:
-
, pak , ale
-
, pak , ale
-
, pak
-
Na základu logaritmu nezáleží
-
Při součtu 2 funkcí stačí ta, která je asymptoticky rychleji rostoucí, neboli .
Ř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
Vyplatí se znát vzorec pro součet členů aritmetické posloupnosti: . Vizuální důkaz.
Řešená úloha 2: Ke zpracování -tého řádku matice velikosti je zapotřebí operací. Kolik je potřeba operací ke zpracování celé matice?
a)
b)
c)
d)
e)
Řešení
Správně je e): Součet pro řádků (aritmetická posloupnost): .
⭐ Řešená úloha 3: Metoda A potřebuje k vyřešení úlohy operací, Metoda B potřebuje operací, přičemž celé číslo popisuje rozsah vstupních dat. Pro jaká je výhodnější použít metodu A?
Řešení
Matematický pohled
Řešená úloha 4: Pro rostoucí spojité fukce , platí . Z toho plyne, že:
Řešení
e): ověříme snadno z definice.
Řešená úloha 5: Pro dvě spojité funkce , rostoucí na celém platí pro každé . Je možné, že ?
Řešení
Ano, například a .
Řešená úloha 6: Uveďte příklad tří rostoucích funkcí reálné proměnné , a , pro které současně platí všechny tři následující vztahy.
Pokud taková trojice funkcí nemůže existovat, zdůvodněte proč.
Řešení
Může, například
Řešená úloha 7: Seřaďte následující funkce dle asymptotické složistosti, identifikujte asymptoticky ekvivalentní funkce.
Řešení
Pokud si nejsme jistí, která ze dvou funkcí f(n) a g(n) má vyšší asymptotickou složitost, spočítáme limitu pomocí L’Hospitalova pravidla.
Praktický pohled
Řešená úloha 8: Algoritmus prochází matici o velikosti a s každým prvkem provádí akci, jejíž složitost je . Jaká je celková (optimální) asymptotická složitost algoritmu ?
Řešení
, algoritmus provede krát operaci která má složitost .
Ř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í
, 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í operací za sekundu. Pro výpočet je k dispozici 1 hodina. Určete, jaká může být maximální hodnota , která určuje velikost vstupních dat, v případě že počet nezbytných operací pro zpracování dat o velikosti je .
A co v případě že zpracování vyžaduje
a) operací
b) operací
c) operací
Úloha 14: Ukažte, že a jsou stejné množiny. (Za předpokladu, že i jsou kladná čísla)
Úloha 15: Ukažte, že a jsou stejné množiny.
Úloha 16: Pro rostoucí spojité fukce , platí . Z toho plyne které z následujících tvrzení?
Úloha 17: Pro dvě spojité funkce , rostoucí na celém platí , . Jsou následující tvrzení pravdivé?
a)
b)
c) pro každé
d) pro každé
e) může existovat takové, že
Úloha 18: Který z následujících výroků je nepravdivý?
a)
b)
c)
d)
e)
Úloha 19: Uveďte příklad tří rostoucích funkcí reálné proměnné , a , pro které současně platí všechny tři následující vztahy.
Pokud taková trojice funkcí nemůže existovat, zdůvodněte proč.
⭐ Úloha 20: Algoritmus prochází pole s prvky. Při zpracování prvku na pozici provede operací. Jaká je asymptotická složitost algoritmu ?
⭐ Úloha 21: Matice A má řádků a sloupců indexovaných od . Na zpracování prvku matice na pozici , () je zapotřebí právě 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 . 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 a pravý dolní roh na pozici ?
Hodnoty 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 .
⭐ Ú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 ale , 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 pro . 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.