Přeskočit na hlavní obsah

Složitosti

Složitost algoritmů pro předmět UTI​

Pro tuto látku je potřeba pochopit pořadí složitostí a potom co znamenají jednotlivé zápisy pro určení složitosti.

  • log(n)log(n)
  • x\sqrt{x}
  • nn
  • n∗log(n)n*log(n)
  • n2n^2
  • n3n^3
  • 2n2^n
  • n!n!
  • nnn^n
  • 22n2^{2^n}

Svým způsobem je pořadí dost intuitivní, ale i tak je potřeba si ho trochu zapamatovat. Nyní k zápisům a jednotlivým porovnáním a zjednodušením, které se provádějí.

Mějme funkce

f1 = n2+5n+4n^2 + 5n + 4

f2 = 3n3+3n2+2n3n^3 + 3n^2 + 2n

f3 = log(2n)log(2^n)

f4 = 10n+410n + 4

Jako první nás trápí, které funkce jsou složitější. Na první pohled vidíme, že f2 roste rychleji, než f1, ale jak je to s dalšími funkcemi, které nejsou vidět na první pohled? Pojďme to zjednodušit.

f1 = n2n^2

f2 = n3n^3

f3 = n∗log(2)n*log(2)

f4 = nn

Při určování složitostí můžeme "smazat" jakékoliv konstanty a násobení konstantama a cokoliv, co je "jen číslo", nebo zanedbatelné. Např. pokud máme něco n3n^3 tak cokoliv, co je n2n^2 a nižší nás nezajímá. Stejně jako 3n33n^3 tak ta konstanta 33 je zbytečná, protože nejvetší a nejhlavnější je složitost n3n^3, násobení konstantou 33 už je zbytečné. U logaritmu se dá aplikovat základní matematika, která říká, že pokud použijeme logaritmus na něco, co má exponent, tak ten exponent můžeme vytknout. Díky tomu nám vzniklo n∗log(2)n * log(2), jenže jak jsme si řekli, násobit konstantou je zbytečné, protože log(2)log(2) je konstanta, můžeme ji smazat.

f1 = n2n^2

f2 = n3n^3

f3 = nn

f4 = nn

Nakonec po úpravách je jasně vidět, která funkce je rychlejší, nebo které jsou stejně rychlé. Jdeme mrknout na nějaké pravidla zápisů a už si určíme na finále jak jsou na tom funkce.

f∈O(n)f\in O(n) funkce f roste pomaleji, nebo stejně rychle než nějaké OO s nějakou složitostí nn. f∈o(n)f\in o(n) funkce f roste pomaleji než nějaké oo s nějakou složitostí nn.

f∈Ω(n)f\in \Omega(n) funkce f roste rychleji, nebo stejně rychle než nějaké Ω\Omega s nějakou složitostí nn. f∈ω(n)f\in \omega(n) funkce f roste rychleji než nějaké ω\omega s nějakou složitostí nn.

f∈Θ(n)f\in \Theta(n) funkce f roste stejně rychle jako nějaké Θ\Theta s nějakou složitostí nn.

pokud platí f∈O(n)f\in O(n) potom zároveň platí f∈o(n)f\in o(n)

pokud platí f∈Ω(n)f\in \Omega(n) potom zároveň platí f∈ω(n)f\in \omega(n)

pokud platí f∈Θ(n)f\in \Theta(n) potom zároveň platí f∈O(n)f\in O(n) f∈Ω(n)f\in \Omega(n) V tomto případě potom ale neplatí f∈o(n)f\in o(n) f∈ω(n)f\in \omega(n) protože OO a Ω\Omega připouští stejně rychle, proto když platí Θ\Theta, která říká, že něco roste stejně rychle, tak platí OO, Ω\Omega, ale oo a ω\omega stejně rychle nepřipouští, proto v tomto případě být nemůže.

Jak je to teda s funkcemi co jsme si ukázali?

f1∈O(f2)f1\in O(f2) - funkce se složitostí n2n^2 roste pomaleji, nebo stejně rychle jako funkce se složitostí n3n^3. Zároveň tedy platí f1∈o(f2)f1\in o(f2)

f1∈Ω(f3)f1\in \Omega(f3) - funkce se složitosti n2n^2 roste rychleji, nebo stejně rychle jako funkce se složitosti nn. Zároveň tedy platí f1∈ω(f3)f1\in \omega(f3)

f1∈Ω(f4)f1\in \Omega(f4) - funkce se složitosti n2n^2 roste rychleji, nebo stejně rychle jako funkce se složitosti nn. Zároveň tedy platí f1∈ω(f4)f1\in \omega(f4)

f3∈Θ(f4)f3\in \Theta(f4) - funkce se složitostí nn roste stejně rychle, jako funkce se složitostí nn. Zároveň tedy platí f3∈Ω(f4) a f3∈O(f4)f3\in \Omega(f4) \space a \space f3\in O(f4) ALE NEPLATÍ f3∈ω(f4) ani f3∈o(f4)f3\in \omega(f4) \space ani \space f3\in o(f4)