SZZ materiály

2

Komplexní algoritmy nad seznamy (filtrování, vyhledávání, třídění/řazení výběrem nebo vkládáním), efektivnější implementace vyhledávání a třídění (binární vyhledávání, merge sort), časová složitost algoritmů

Užitečné odkazy

Filtrování

\[S' = \{x \in S \mid P(x)\}\] \[|S'| \leq |S|\]

Příklad

Mějme množinu čísel $S = {1, 5, 8, 12, 15}$ a predikát $P(x)$, který říká, že „$x$ je sudé číslo“.

\[P(x) \equiv x \pmod 2 = 0\]

\(S' = \{x \in S \mid P(x)\} = \{8, 12\}\) \(S' = \{x \in S \mid x \pmod 2 = 0\} = \{8, 12\}\)

Výsledkem bude $S’ = {8, 12}$, přičemž platí, že počet prvků (kardinalita) výsledku je menší než počet prvků vstupu ($2 \leq 5$).

Pojmy

Vyhledávání

Příklad

Mějme uspořádanou množinu $S = {1, 5, 8, 12, 15}$ a hledejme prvek $x_{target} = 12$.

Definujeme predikát shody: $P(x) \colon x = 12$.

Algoritmus projde množinu $S$ a testuje $P(x)$ pro každý prvek.

Pro $x = 12$ je $P(12)$ pravda.

Výsledek: Prvek nalezen na pozici (indexu) $i = 3$ (při indexování od 0).\(S[i] = x_{target}\)

Pojmy

Rozdíl mezi filtrováním a vyhledáváním

Zatímco filtrování vytváří novou podmnožinu prvků na základě platnosti predikátu, vyhledávání provádí identifikaci a následnou lokalizaci konkrétního prvku za účelem získání jeho indexu nebo potvrzení existence.

Třídění / Řazení

Mějme vstupní množinu $S$. Třídění je proces hledání takové permutace $S_{sorted}$, pro kterou platí:

\(x_1 \leq x_2 \leq \dots \leq x_n\) \(|S_{sorted}| = |S|\)

Příklad

Mějme množinu $S = {15, 5, 12, 1, 8}$ a relaci uspořádání $\leq$ (vzestupně).

  1. Vstup: Permutace ${15, 5, 12, 1, 8}$.
  2. Proces: Transformace prvků na základě porovnávání dvojic.
  3. Výstup: Permutace $S_{sorted} = {1, 5, 8, 12, 15}$.

Výsledkem je seřazená posloupnost: \(1 \leq 5 \leq 8 \leq 12 \leq 15\) \(|S_{sorted}| = 5\)

Pojmy

Třídění výběrem (Selection Sort)

Principiálně algoritmus funguje tak, že řekneme, že momentální index je ten nejmenší. Pak se začneme koukat na jeho sousedy napravo a jakmile narazíme na souseda, který je menší, řekneme, že on je ve skutečnosti ten nejmenší index a měli by si vyměnit místo. Není to ale tak, že by narazil na prvního menšího souseda a tím to končilo - on projde všechny sousedy a vybere opravdu toho nejmenšího z nich. Až pak se teprve prohodí s tím opravdu nejmenším. Indexy se pak o jedna posunou a ten stejný proces se jede odznova.

  1. Na začátku je na currentIndex trojka a na candidateIndex je jednička. V cyklu je ta podmínka jestli je jednička menší než trojka, což je pravda, takže jednička je smallestIndex. Pak se koukáme na čtyřku, a ptáme se - je čtyřka menší než jednička? Není, takže se ptáme je jednička menší než jednička? Není, takže se ptáme je pětka menší než jednička? Není, takže se ptáme je devítka menší než jednička? Není, takže se ptáme je dvojka menší než jednička? Není, takže se ptáme je šestka menší než jednička? Není, vnitřní cyklus končí, z první iterace vyplynulo, že smallestIndex je ta jednička, a protože smallestIndex není currentIndex (jednička není trojka), tak je prohodíme. Jednička se dostala na nulté místo, trojka se přesunula na první místo.

  2. Teď se zvedne currentIndex o jedna, takže původně byl nula, teď je jedna. To samé candidateIndex - původně byl jedna, teď bude dva. Vždycky o jedno větší než currentIndex. Takže teď je na currentIndex trojka a na candidateIndex je čtyřka. A teď stejný proces jako předtím. Je čtyřka menší než trojka? Není, takže se ptáme je jednička menší než trojka? Ano, je, řekneme že smallestIndex je index jedničky. Jdeme dál - je pětka menší než jednička? Není, takže se ptáme je devítka menší než jednička? Není, takže se ptáme je dvojka menší než jednička? Není, takže se ptáme je šestka menší než jednička? Není, vnitřní cyklus končí, z druhé iterace vyplynulo, že smallestIndex je znovu jednička, ale ta další co se nachází v seznamu, takže ji prohodíme s trojkou.

A takhle znovu a znovu.

Třídění vkládáním (Insertion Sort)

Princip

Princip

Merge Sort

Princip