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
  • nlog(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 = nlog(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 nlog(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.

fO(n)f\in O(n) funkce f roste pomaleji, nebo stejně rychle než nějaké OO s nějakou složitostí nn. fo(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í fO(n)f\in O(n) potom zároveň platí fo(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í fO(n)f\in O(n) fΩ(n)f\in \Omega(n) V tomto případě potom ale neplatí fo(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?

f1O(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í f1o(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 f3O(f4)f3\in \Omega(f4) \space a \space f3\in O(f4) ALE NEPLATÍ f3ω(f4) ani f3o(f4)f3\in \omega(f4) \space ani \space f3\in o(f4)