Složitost algoritmů, vyhledávání, řazení

Cite
  • Časová a paměťová složitost algoritmů
  • Algoritmy vyhledávání
    • Sekvenční
    • Půlením intervalu (Binární vyhledávání)
  • Algoritmy slučování a řazení
    • BubbleSort
    • SelectSort
    • InsertSort
    • MergeSort
    • QuickSort
  • Dolní meze složitosti řazení v porovnávacím modelu
  • Řazení v lineárním čase

Časová a paměťová složitost

  • Časová složitost
    • Náročnost algoritmu na výpočetní prostředky v závislosti na velikosti vstupu
    • Neměří se v sekundách, ale v počtu potřebných operací
    • Nezávislá na implementaci, jazyku, zařízení
  • Paměťová složitost
    • Maximum z počtu využité paměti v závislosti na velikosti vstupu
    • Lze rozdělit na:
      • In-place - Pracuje s konstantní pamětí
      • Out-of-place - Průběžně alokuje potřebnou paměť

Asymptotický odhad

  • Zobecněný odhad složitosti

  • Uvažujeme pouze členy nejvyššího řádu, vynecháváme multiplikativní konstanty

  • Využíváme notaci velkého O,

  • Značení

  • Složitosti ve vzestupném pořadí:

    1. Konstantní
    2. Logaritmická - většinou jako důsledek půlení intervalů
    3. Odmocninová
    4. Lineární
    5. Mocninná - většinou jako důsledek vnořených cyklů
    6. Exponenciální
    7. Faktoriál

Algoritmy vyhledávání

  • Sekvenční

    • Procházení celé struktury a porovnávání každé hodnoty s hledanou
    • Nelze optimalizovat, pokud neznám pořadí prvků
    • , protože v nejhorším případě je nutné projít všechny prvky
  • Půlením intervalu

    • Binární vyhledávání, velikost problému se půlí v každé iteraci
    • Vyžaduje seřazenou strukturu (např. BVS)

Algoritmy slučování a řazení

  • Stabilní - Zachovává původní vzájemné pořadí prvků se stejným klíčem

  • Nestabilní - Nezaručuje zachování tohoto pořadí, může prvky se stejným klíčem promíchat

  • Datově citlivý - Závislost na vstupních datech - pokud dostane už téměř seřazené pole, proběhne rychle, u rozházeného proběhne pomalu

  • Datově necitlivý - Nezávisí na vstupních datech

BubbleSort

  • Algoritmus
    1. Porovnává 2 sousední prvky
    2. Pokud jsou v nesprávném pořadí, prohodí je. Takto porovnává, dokud největší prvek "nevybublá" nahoru a není už seřazený
    3. Takto ve vlnách opakuje dokola
  • Časová:
  • Paměťová: In-place, stabilní, citlivý

../../Attachments/Pasted image 20260608130034.png

SelectSort

  • Algoritmus
    1. Nejprve projdeme celé pole a vybereme min
    2. Pak min prohodíme s prvním prvkem, získáme první zatříděný prvek
    3. Od druhého prvku opět projdeme celé pole a vybereme min
    4. Pak min prohodíme s druhým prvkem, získáme druhý zatříděný prvek
    5. Takto se opakuje, dokud není celé setříděné
  • Časová:
  • Paměťová: In-place, nestabilní, necitlivý

InsertSort

  • Algoritmus

    1. První prvek v poli považujeme za seřazený
    2. Další prvek (z neseřazené části "vyjmeme ven" a uložíme do paměti/proměnné mem), tím vznikne volné místo za seřazenou částí
    3. Prvky seřazené části od konce porovnáváme s mem
      1. Pokud jsou větší než mem, posune je v poli doprava
      2. Pokud je prvek menší než mem (nebo jsme na začátku pole), vloží mem za něj (resp. na začátek pole)
    4. Pokračuje krokem 2., dokud existují další neseřazené prvky
  • Časová:

  • Paměťová: In-place, stabilní, citlivý

  • I když časové a paměťové vlastnosti vypadají stejné jako BubbleSort, InsertSort nedělá prohazování, jen posunutí v poli o jednu pozici. Tyto operace jsou efektivnější a rychlejší.

  • Dokáže řadit, i když mu v průběhu přicházejí další a další data (tzv. "online řazení")

MergeSort

  • Založen na metodě Rozděl a panuj, využívá rekurzi

  • Algoritmus

    1. (Rozdělení) Rekurzivně rozděluje pole na poloviny, dokud nezůstane pole velikosti 1 (to považujeme za seřazené)
    2. (Slévání) O krok výše tyto dvě "podpole" sléváme dohromady
      1. V každém máme index
      2. Posouváme indexy, porovnáváme hodnoty prvků
      3. Ten menší prvek vložíme na začátek nového seřazeného pole a posuneme index
  • Časová:

  • Paměťová: (na pomocné pole), stabilní, necitlivý

../../Attachments/Pasted image 20260608135357.png

QuickSort

  • Podobný MergeSortu

  • Nepotřebuje pomocné pole, žádný prostor navíc

  • Algoritmus

    1. Zvolí se pivot - ideálně to je medián, ale většinou ho neznáme. Bere se buď náhodný prvek, nebo vždy první (či poslední)
    2. Rozdělí vstup na části - levou (< pivot), střední (pivot) a pravou (> pivot)
    3. Obě části se řadí rekurzivně, střední (pivot) je považována za seřazenou
  • Časová: Nejhůře , typicky

  • Paměťová: "In-place", nestabilní, necitlivý

    • In-place z hlediska, že nepotřebuje pomocné pole, prohazuje prvky v původním
    • Overhead rekurze ale spotřebovává paměť zásobníku, tam je

../../Attachments/Pasted image 20260608141122.png

Dolní mez složitosti problému

  • Mějme nějakou složitost, nelze sestrojit algoritmus rychlejší než tato mez, označujeme

  • Předpoklad: Porovnávací model RAM

    • Čísla lze pouze porovnávat a přesouvat v paměti
    • Algoritmus je deterministický a nepoužívá zdroj náhody
    • O číslech nic víc nevíme! (pokud bychom věděli, že jde např. o omezená celá čísla, dokázali bychom to pomocí algoritmů jako CountingSort nebo RadixSort seřadit i v lineárním čase )
  • Problém vyhledávání

    • = alespoň
    • V seřazené posloupnosti
    • Neexistuje žádný deterministický algoritmus, který by našel číslo v -prvkové seřazené množině použitím řádově méně než operací
    • Protože i když je pole úplně seřazené, binárním vyhledáním máme
  • Problém řazení

    • = alespoň
    • Řazení je ekvivalentní rozpoznání, o kterou permutaci z možných se jedná
    • Binární strom s listy, takže má hloubku nejméně (Stirlingova formule)

Řazení v lineárním čase

  • Speciální řadící algoritmy, které nepracují v porovnávacím modelu RAM
  • Využívají i nějakou další speciální vlastnost vstupu

CountingSort

  • Řazení celých čísel z množiny

  • Omezení rozsahu vstupu je právě tou speciální vlastností

  • Prvky vůbec neporovnává, namísto toho využívá indexy v poli jako přihrádky

  • Algoritmus

    1. Spočítá, kolikrát se ve vstupním poli každé číslo vyskytuje (histogram)
    2. Nad tímto polem počtů výskytů pak vypočte prefixovým součtem pozice, kde budou po seřazení začátky oblastí tvořených stejnými čísly
    3. Projde podruhé vstupní pole, pro každý prvek určí jeho pozici, na které se má nacházet po seřazení. Na tuto pozici ho přesune
  • Časová:

  • Paměťová: , stabilní, necitlivý

    • Není in-place, potřebuje externí paměť, a to dost
    • Necitlivý na uspořádání vstupu, citlivý na rozsah hodnot (to číslo )

LexCountingSort

  • Lexikograficky řadí -tice (např. víceciferná čísla, řetězce apod.)

  • Využívá toho, že CountingSort je stabilní

  • Algoritmus

    1. Seřadíme podle poslední pozice pomocí CountingSortu
    2. Opakujeme s předchozí pozicí
  • Časová:

  • Paměťová: , stabilní, necitlivý

    • Necitlivý na uspořádání vstupu, citlivý na parametry

../../Attachments/Pasted image 20230125151903.png


Vytvořeno: 27. 5. 2026, 11:59
Poslední aktualizace: 9. 6. 2026, 16:04