Toggle menu
Toggle preferences menu
Toggle personal menu
Neprihlásený/á
Your IP address will be publicly visible if you make any edits.

Asymptotické hranice výpočtovej zložitosti: Rozdiel medzi revíziami

Poznámkovač
Bez shrnutí editace
Bez shrnutí editace
Značky: vrátené editor wikitextu 2017
Riadok 87: Riadok 87:
* pre priemernú (Theta) hranicu: spojenie hornej a dolnej hranice, v podstate stále iba <math>\Theta(n)</math>;
* pre priemernú (Theta) hranicu: spojenie hornej a dolnej hranice, v podstate stále iba <math>\Theta(n)</math>;
Ale formálne môžme uviesť iba priemerný prípad (Theta notáciu), teda <math>\Theta(n)</math>.
Ale formálne môžme uviesť iba priemerný prípad (Theta notáciu), teda <math>\Theta(n)</math>.
bubblesort test iframe
<iframe allowtransparency="true" src="http://localhost:5173/#/embed/custom?data=eyJ0aXRsZSI6IkN1c3RvbSBBc3NpZ25tZW50IiwiYXNzaWdubWVudCI6IjxwPkRlc2NyaXB0aW9uIG9mIHlvdXIgYXNzaWdubWVudDwvcD4iLCJtYXhTY29yZSI6MiwiZmlsZXMiOlt7ImZpbGVuYW1lIjoiaW5kZXguaHRtbCIsInJlYWRvbmx5IjpmYWxzZSwiaGlkZGVuIjp0cnVlLCJhdXRvcmVsb2FkIjpmYWxzZSwiY29udGVudCI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWw-XG48aGVhZD5cbiAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI-XG4gIDx0aXRsZT5CdWJibGUgU29ydDwvdGl0bGU-XG4gIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwic3R5bGUuY3NzXCI-XG48L2hlYWQ-XG48Ym9keT5cbiAgPHNjcmlwdCBzcmM9XCJzY3JpcHQuanNcIj48L3NjcmlwdD5cbjwvYm9keT5cbjwvaHRtbD4ifSx7ImZpbGVuYW1lIjoic2NyaXB0LmpzIiwicmVhZG9ubHkiOmZhbHNlLCJoaWRkZW4iOmZhbHNlLCJhdXRvcmVsb2FkIjp0cnVlLCJjb250ZW50IjoiZnVuY3Rpb24gYnViYmxlU29ydChwb2xlLCBqZVZ6b3N0dXBuZT1mYWxzZSkge1xuICAvLyBidWJibGUgc29ydFxuXG4gIHJldHVybiBwb2xlO1xufSJ9LHsiZmlsZW5hbWUiOiJ0ZXN0LmpzIiwicmVhZG9ubHkiOmZhbHNlLCJoaWRkZW4iOnRydWUsImF1dG9yZWxvYWQiOmZhbHNlLCJjb250ZW50IjoiZnVuY3Rpb24gcnVuVGVzdHMod2luZG93KSB7XG4gIGZ1bmN0aW9uIGNvcnJlY3RCdWJibGVTb3J0KHBvbGUsIGplVnpvc3R1cG5lID0gZmFsc2UpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb2xlLmxlbmd0aCAtIGkgLSAxOyBqKyspIHtcbiAgICAgIGlmIChqZVZ6b3N0dXBuZSkge1xuICAgICAgICBpZiAocG9sZVtqXSA8IHBvbGVbaiArIDFdKSB7XG4gICAgICAgICAgbGV0IHBvbSA9IHBvbGVbal07XG4gICAgICAgICAgcG9sZVtqXSA9IHBvbGVbaiArIDFdO1xuICAgICAgICAgIHBvbGVbaiArIDFdID0gcG9tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocG9sZVtqXSA-IHBvbGVbaiArIDFdKSB7XG4gICAgICAgICAgbGV0IHBvbSA9IHBvbGVbal07XG4gICAgICAgICAgcG9sZVtqXSA9IHBvbGVbaiArIDFdO1xuICAgICAgICAgIHBvbGVbaiArIDFdID0gcG9tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2xlO1xufVxuXG4gIGNvbnN0IHRlc3RzID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiQnViYmxlIHNvcnQgem9zdHVwbmVcIixcbiAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbmRvdykge1xuICAgICAgICBsZXQgYXJyYXkgPSBbLTEyLCAwLCA1LCAtOCwgNSwgMywgMiwgMSwgOSwgMTAsIDUwXTtcbiAgICAgICAgLy8gU29ydGVkIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgIGxldCBhID0gY29ycmVjdEJ1YmJsZVNvcnQoYXJyYXkuc2xpY2UoKSwgdHJ1ZSk7XG4gICAgICAgIGxldCBiID0gd2luZG93LmJ1YmJsZVNvcnQoYXJyYXkuc2xpY2UoKSwgdHJ1ZSk7XG4gICAgICAgIGxldCBzdWNjZXNzID0gSlNPTi5zdHJpbmdpZnkoYSkgPT09IEpTT04uc3RyaW5naWZ5KGIpO1xuICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIG1lc3NhZ2U6IHN1Y2Nlc3MgPyBcIsSMw61zbGEgc8O6IHpvcmFkZW7DqVwiIDogXCLEjMOtc2xhIG5pZSBzw7ogem9yYWRlbsOpXCIgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIkJ1YmJsZSBzb3J0IHZ6b3N0dXBuZVwiLFxuICAgICAgdGVzdDogZnVuY3Rpb24od2luZG93KSB7XG4gICAgICAgIGxldCBhcnJheSA9IFstMTIsIDAsIDUsIC04LCA1LCAzLCAyLCAxLCA5LCAxMCwgNTBdO1xuICAgICAgICAvLyBTb3J0ZWQgYXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICBsZXQgYSA9IGNvcnJlY3RCdWJibGVTb3J0KGFycmF5LnNsaWNlKCksIGZhbHNlKTtcbiAgICAgICAgbGV0IGIgPSB3aW5kb3cuYnViYmxlU29ydChhcnJheS5zbGljZSgpLCBmYWxzZSk7XG4gICAgICAgIGxldCBzdWNjZXNzID0gSlNPTi5zdHJpbmdpZnkoYSkgPT09IEpTT04uc3RyaW5naWZ5KGIpO1xuICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIG1lc3NhZ2U6IHN1Y2Nlc3MgPyBcIsSMw61zbGEgc8O6IHpvcmFkZW7DqVwiIDogXCLEjMOtc2xhIG5pZSBzw7ogem9yYWRlbsOpXCIgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xuICBcbiAgcmV0dXJuIHRlc3RzLm1hcCh0ID0-IHtcbiAgICBjb25zdCByZXN1bHQgPSB0LnRlc3Qod2luZG93KTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgc3VjY2VzczogcmVzdWx0LnN1Y2Nlc3MsXG4gICAgICBtZXNzYWdlOiByZXN1bHQubWVzc2FnZVxuICAgIH07XG4gIH0pO1xufVxuIn1dLCJtYWluRmlsZSI6ImluZGV4Lmh0bWwiLCJwcmV2aWV3VHlwZSI6Imh0bWwifQ&autoReload=false" style="width: 100%; height: 600px; border: none; background: transparent;"></iframe>


{{Téma|Oblast=Kategória:Algoritmy a výpočtová zložitosť|Poradie=40}}
{{Téma|Oblast=Kategória:Algoritmy a výpočtová zložitosť|Poradie=40}}


[[Kategória:Algoritmy a výpočtová zložitosť]]
[[Kategória:Algoritmy a výpočtová zložitosť]]

Verzia z 12:02, 8. apríl 2025

Asymptotická horná a dolná hranica funkcie zložitosti, najlepší, priemerný a najhorší prípad, asymptotická presná notácia.


Algoritmy, s ktorými sme sa streli v predošlej téme mali rôzne hranice ich výpočtových zložitostí. Ale čo to vlastne znamená že tieto funkcie majú určitú hranicu?

Vysvetlime to na jednoduchom kóde:

# existuje n.index(...), ale to by sme si toho moc neukázali:
def najdi_index_prvku(zoznam, hladaj):
  for n, prvok in enumerate(zoznam): # n = index aktuálneho prvku
    if prvok == hladaj:
      return n

  return -1 # prvok sa nenašiel

Časová zložitosť tohto algoritmu je O(n) (lineárna), priestorová O(1) (konštantná – nepoužíva dodatočnú pamäť).

Keďže zoznam na vstupe je usporiadanou množinou, môže nastať viacero situácií. Napríklad:

zoznam = [1, 2, 3]

hladaj = 4
index = najdi_index_prvku(zoznam, hladaj)
print(index) # vypíše -1
# prvok neexistuje, musíme teda prejsť celým zoznamom
# časová zložitosť je preto O(n)
# (ak predpokladáme, že prvok sa nikdy nebude v zozname nachádzať = najhorší prípad)

hladaj = 1
index = najdi_index_prvku(zoznam, hladaj)
print(index) # vypíše 0
# číslo 1 sa nachádza na prvom indexe (0), čo predstavuje najlepší (ideálny) prípad
# ak by sa hľadaný prvok vždy nachádzal na prvom mieste
# (teda, vždy by sme mali ideálne podmienky a najlepší prípad), tak by zložitosť bola
# konštantná = O(1), pretože by sme vykonali iba jednu operáciu porovnania

Vidíme dva prípady:

  • V prvom je časová zložitosť O(n), pretože musíme prejsť všetkými prvkami v zozname – a nakoniec zistíme, že sa tam prvok aj tak nenachádza.
    • Toto sa nazýva: najhorší prípad;
    • Vyjadruje ju notácia Big-O: O(f(n));
  • V druhom prípade je časová zložitosť O(1), pretože hľadaný prvok sa nachádza na prvom mieste, vykonáme teda iba jednu operáciu porovnania (a zložitosť je konštantná).
    • Toto sa nazýva: najlepší prípad;
    • Vyjadruje ju notácia Omega: Ω(f(n));
  • Poznámka: v oboch prípadoch je priestorová zložitosť O(1), pretože samotný algoritmus nepotrebuje žiadnu dodatočnú pamäť ktorá by sa menila v závislosti od n.

Z toho vyplýva, že v závislosti od usporiadania prvkov na vstupe a hodnoty ktorú hľadáme sa môže zmeniť aj výpočtová zložitosť algoritmu. Avšak, v praxi sme pesimisti a najčastejšie vždy vyjadrujeme Big-O notáciu (teda, O(f(n))), pretože predpokladáme Murphyho zákon, teda:

Všetko čo sa môže pokaziť, sa pokazí.

Asi si vieš predstaviť, že to tak naozaj funguje. Ale niekedy je možno užitočné vyjadriť aj priemerný prípad – je to v podstate spojenie hornej a dolnej hranice funkcie výpočtovej zložitosti, a vyjadrujeme ju ako Theta: Θ(f(n)). Theta notáciu môžeme použiť iba vtedy, ak vieme že priemerná zložitosť je presne ohraničená zhora aj zdola rovnakou funkciou.

V skratke:

  • Ak vieme len hornú hranicu, ale nie dolnú, použijeme Big-O notáciu;
  • Ak vieme len dolnú hranicu, ale nie hornú, použijeme Omega notáciu;
  • Ak je rast výpočtovej zložitosti algoritmu presne obmedzený rovnakou funkciou zhora aj zdola, použijeme Theta notáciu;

Najhorší prípad

.

Najlepší prípad

.

Priemerný prípad

Existuje aj algoritmus, ktorý dokáže obsiahnuť všetky príklady:

def spocitaj_prvky(mnozina):
  pocet = 0

  for _ in mnozina:
    pocet += 1

  return pocet

V tomto algoritme je najhorší prípad zároveň aj najlepším. Bez ohľadu na veľkosť alebo usporiadanie prvkov v poli musíme vždy prejsť všetkými prvkami. Preto sú všetky notácie časovej zložitosti lineárne:

  • pre hornú (Big-O) hranicu: O(n);
  • pre dolnú (Omega) hranicu: Ω(n);
  • pre priemernú (Theta) hranicu: spojenie hornej a dolnej hranice, v podstate stále iba Θ(n);

Ale formálne môžme uviesť iba priemerný prípad (Theta notáciu), teda Θ(n).


bubblesort test iframe