Pořádně formálně zpracované - takto řekl cvičící, že má vypadat vzorové řešení. Mé správné, ale jen pomocí slov téměř poslal do koše.
Ač to mistři v recodexu zapisovali =O(n2), tak se myslí ∈O(n2), "Relace "=" znamená náležení do třídy funkcí."
Vycházíme z definice:
f(n)∈O(g(n))⟺∃c∈R+∃n0∈N∀n≥n0:f(n)≤c⋅g(n)
f,g jsou funkce N→R+
Cituji z Průvodce (2022, sekce 2.4 Asymptotická notace, str. 50):
Nechť f,g:N→R jsou 2 funkce. Řekněme, že funkce f(n) je třídy O(g(n)), jestliže existuje taková realná kladná konstanta c, že pro skoro všechna n platí f(n)≤c⋅g(n). Skoro všemi n se myslí, že nerovnost může selhat pro konečně mnoho výjímek, tedy, že existuje nějaké přirozené n0 takové, že nerovnost platí pro všechna n≥n0. Funkci g(n) se pak říká asymptotický horní odhad funkce f(n).
Na zápis O(g) bychom se mohli dívat jako na množinu všech funkcí f, které splňují uvedenou definici. Proto můžeme místo "funkce f je třídy O(g)" psát f∈O(g). Navíc to umožní elegatně zapisovat různé vztahy typu O(n)⊆O(n2)
Průvodce to definuje to pro R, ale tady v cvičení máme všechny funkce do R+, a budeme toho v důkazech využívat, bude nám stačit definice pro R+.
Tu část s konstantně mnoho výjimkami budu používat.
f(n)∈Ω(g(n))⟺∃c∈R+∃n0∈N∀n≥n0:f(n)≥c⋅g(n)
f,g jsou funkce N→R+
Dokažte nebo vyvraťte tvrzení. Pro každou dvojici funkcí f,g,f1,f2:N0→R+ platí:
n2+6n+4=O(n2)
n2+6n+4∈O(n2)
n2+6n+4≤c⋅n2
n2n2+6n+4≤c
1+n6+n24≤c
Platí např. pro c=10, s tím, že n0=1
n3=O(n2)
n3≤c⋅n2
n2n3≤c
n≤c neplatí, protože ať vybereme pro zvětšující se n jakkoliv velké c, vždy bude existovat n>c => nekonečný počet výjimek => vyvráceno
Pokud f(n)=O(g(n)), pak 2f(n)=O(2g(n))
f(n)∈O(g(n))⟹2f(n)∈O(2g(n))
Dosaďme tam např. f(n)=2n, a g(n)=n.
Levá strana platí:
2n≤c⋅n
2≤c, platí
Pravá strana neplatí:
22n≤c2⋅2n
2n22n≤c2
2n≤c2 neplatí, protože ať už pro rostoucí 2n vybereme jakékoli c2, vždy bude existovat 2n>c2 => nekonečný počet výjimek => neplatí
Když neplatí pravá strana implikace, implikace neplatí.
f(n)=O(f(n)2)
f(n)∈O(f(n)2)
Tohle je chyták!!! Přestože se v informatice u složitosti běžně nesetkáváme s klesajícími funkcemi, může f(n) zde být klesající (protože f je pouze nějaké f:N0→R+, nevíme o něm nic víc), a pak tvrzení platit nebude.
Například předpokládejme, že f(n)=n1:
n1≤c⋅n21
n≤c => spor, viz úloha 2., vždy lze nalézt n>c
Tvrzení neplatí.
Nechť f(n)=f1(n)+f2(n) a f1(n)=O(f2(n)). Pak f(n)=O(f2(n))
Všimněme si, že platnost těchto 2 nerovnic začíná od různých konstant. Když tedy budeme chtít něco trvdit pro obě zároveň, tedy například v f1(n)+f2(n)≤g(n), tak bychom měli provést průnik intervalů [n01,∞) a [n02,∞).
Tedy zvolit maximum z těch dvou.
n0 je ≥max{n01,n02}, abychom tedy splnili podmínku o konečném množství výjimek.
pro n0≥max{n01,n02}:
f1(n)+f2(n)≤c⋅g(n)
c1⋅g(n)+c2⋅g(n)≤c⋅g(n)
c1+c2≤c => vždy najdeme konstantu větší než součet 2 jiných
Nechť f1 a f2 jsou funkce, pro které platí f1(n)=O(g1(n)) a f2(n)=O(g2(n)). Potom f1(n)⋅f2(n)=O(g1(n)⋅g2(n))
Pokud na levé straně implikace má platit obojí současně, tak pro n≥max{n1,n2}.
Pravá strana pak též pro n≥max{n1,n2}:
f1(n)⋅f2(n)=O(g1(n)⋅g2(n))
f1(n)⋅f2(n)≤g1(n)⋅g2(n)
Dosadíme levou stranu (násobit, dělit beze změny znaménka nerovnosti můžeme protože z definice c,g1,g2 víme, že se jedná o kladná čísla (kladná konstanta a zobrazení do R+)):
(c1⋅g1(n))⋅(c2⋅g2(n))≤g1(n)⋅g2(n)
c1⋅c2≤c => platí, vždy lze najít konstantu, která je ≥ součinu 2 čísel.
Lze postupovat i 2. způsobem: nerovnice f1(n)⋅f2(n)=O(g1(n)⋅g2(n)) a f1(n)⋅f2(n)≤g1(n)⋅g2(n) spolu vynásobíme (můžeme protože z definice c,g1,g2 víme, že se jedná o kladná čísla):
f1(n)⋅f2(n)≤c1⋅g1(n)⋅c2⋅g2(n)
f1(n)⋅f2(n)≤c v cıˊleneˊ rovnici(c1⋅c2)⋅g1(n)⋅g2(n)
c1⋅c2 je člen c v cílené rovnici (té, kam se snažíme v důkazu dojít), tedy ∃c=c1⋅c2, aby nerovnosti a tedy i tvrzení platily.
f=O(g) potom g=Ω(f)
f(n)∈Ω(g(n))⟺∃c∈R+∃n0∈N∀n≥n0:f(n)≥c⋅g(n)
Tedy stejná definice jako pro O(g(n)), ale otočené znaménko nerovnosti.
pro n>n0:
f(n)∈O(g(n))⟹g(n)∈Ω(f(n))
levá strana:
f(n)∈O(g(n))
f(n)≤c1⋅g(n)
f(n)⋅c11≤g(n)
g(n)≥f(n)⋅c11
pravá strana:
g(n)∈Ω(f(n))
g(n)≥c⋅f(n)
Takže máme:
g(n)≥c11⋅f(n)⟹g(n)≥c⋅f(n)
A to už platí, protože je to vlastně stejná nerovnost. Vždy lzde stanovit c1 resp. c2 tak aby platilo c11=c2 a platí pro stejná n jako f(n)∈O(g(n)).
Ještě pár příkladů, tentokrát z Průvodce (2.4 Asymptotická notace, str. 51). Ty už ovšem nikým oveřené nejsou.
Ještě definice:
Řekněme, že funkce f(n) je třídy Θ(g(n)), jestliže f(n) je jak třídy O(g(n)), tak třídy Ω(g(n)).
Symboly Ω a Θ opět mohou značit i příslušné množiny funkcí. Pak jistě platí Θ(g)=O(g)∩Ω(g)
Nalezněte co nejvíc asymptotických vztahů mezi těmito funkcemi n, logn, loglogn, n, nlogn, 2n, n3/2, n!, nn.
(jelikož jsme v informatice, tak ty logaritmy uvažujeme o základu 2, ale to je jedno - logaritmus o základu 10 se liší konstanta krát)
Třeba log(n)∈O(n). Mohli bychom se podívat na grafy y=log2(x) a y=n, a říct, že to je zcela zřejmé, ale pokud bychom to chtěli formálně, a neumíme nic z analýzy, tak to můžeme udělat indukcí.
log2(n)∈O(n)
log2(n)≤c⋅n
Konstanta c existuje, př. to můžeme ukázat pro c=1. A n0=1.
n=1: log2(1)≤1 = 0≤1, platí
Chceme ukázat, že z n=k: log2(k)≤k plyne n=k+1: log2(k+1)≤k+1.
Logaritmus je funkce rostoucí, tudíž můžeme říct, že:
log2(k+1)≤log2(2k), protože 2k>k+1 pro k≥1
log2(2k)=log2(k)+log2(2)=log2(k)+1
log2(k+1)≤log2(k)+1
A teď využijeme indukčního předpokladu, dosadíme za log2(k) výraz, který je větší nebo roven:
log2(k+1)≤k+1
To je to, k čemu jsme se chtěli dostat.
4. Dokažte, že nlogn∈/O(n):
nlogn∈O(n)
nlogn≤c⋅n
logn≤c => neplatí, my jsme však chtěli nlogn∈/O(n), tak to platí: