# Algoritmické strategie ## Brutální síla - problém řešen prohledáním všech podmnožin, uspořádání nebo potencionálních řešení a výběrem nejlepšího + pro malé problémy postačující + často superpolynomiální složitost + obvykle snadná garance správnosti algoritmu ## Greedy strategie - očekávané řešení je množina $n$ prvků - začneme s prázdnou množinou - vždy zafixujeme 1 položku řešení, kterou už neměníme - takto pokračujeme dál, dokud nejsou všechny zafixované - pořadí podle slibnosti položek (od slibnějších k méně) - "greedy" - nikdy se nevrací, nikdy nemění dřívě udělané rozhodnutí Příklady - greedy algoritmus pro minimální kostru - greedy heuristika pro minimálního cestujícího ## Inkrementální strategie - obvykle nevede k optimálním algoritmům - obvykle implementačně jednoduché, zejména vkládání - dovoluje různé modifikace ### Inkrementální vkládání - budujeme řešení (strukturu) o $n$ položkách - napřed řešení o $n-1$ položkách, pak nezbytné změny a vložení $n$-té položky - v paměti někdy dílčí řešení, někdy jen současný stav - zvlášť užitečné pro geometrické algoritmy - **on-line metoda** - vstup nemusí být celý dostupný na začátku - užitečné pro reálná data, ale část práce se dělá zbytečně Příklady - insertion sort - obarvení vrcholů - hvězdicová polygonizace ### Inkrementální konstrukce - budujeme řešení (strukturu) inkrementálně, v každém okamžiku kousek - vstup zpracováván v pořadí, jaké algoritmus chce, nikoliv v pořadí, jak vstupní data přicházejí - **off-line metoda** - vstup musí být celý k dispozici - vhodné pořadí vstupních dat někdy určeno předem (např. presort), někdy až v průběhu výpočtu - časté pro geometrické problémy Příklady - selection sort ### Jiné inkrementální strategie **Inkrementální změna** Příklad: Generování permutací - generujte všechny/náhodnou/další permutaci délky $n$ - permutace v poli, inkrementální změna = jeden swap v poli - inkrementální změna generuje další permutaci z předchozí - extrémně rychlé - až $O(1)$ v průměru pro 1 permutaci, nezávisí na $n$ ## Rozděl a panuj (D&C) - angl. *divide-and-conquer* - složitý problém je rozdělen na jednodušší podproblémy - řešení podproblémů se poté spojí na celkové řešení - pro dekomponovatelné problémy - dělení a spojování nesmí být dražší než původní problém - dekompozice a zejména spojování často obtížné + obvykle využita rekurze + původně vojenská strategie Příklady - mnoho významných, ale obvykle obtížných algoritmů - např.: mergesort, FFT, Strassenovo maticové násobení - quicksort - dláždění šachovnice - binary search, bisection (půlení intervalu) - rychlá mocnina - odmocnina ## Prohledávání s návratem (Backtracking) - systematický průchod všemi možnými konfiguracemi prostoru - obvykle prohledávání stromu do hloubky (DFS) - menší spotřeba paměti než u prohledávání do šířky (BFS) - pokud nelze postupovat dál směrem k listu, návrat k poslednímu rozhodovacímu místu - odtud jiný postup (strategie pokusu a omylu) + vhodné také pro paralelní implementaci (spousta práce, málo komunikace) + množina všech možných řešení se rozdělí na podmnožiny a ty se paralelně prohledávají + pokud některý procesor hotov a jiný ne, přerozdělí se dosud nehotová část množiny řešení mezi hotové procesory + kromě přerozdělování je komunikace nutná jen pro nalezení nejlepšího řešení z nejlepších řešení jednotlivých procesorů **Typické úlohy** - nejčastěji permutační, herní nebo grafové - všechny možné permutace nebo podmnožiny objektů - průchod všech koster grafu nebo cest mezi 2 vrcholy **Typické aplikace** 1. Optimalizační problémy, zejména komerční - obchodní cestující, vhodné linky pro autobusy - plánování (schůzky - sdružit seznam kandidátů se seznamem protikandidátů) - turnajové schéma (kandidáti i protikandidáti ze stejného seznamu) - výzkum trhu (testování výrobků) - sladění nabídky a poptávky - prohledávání adresáře s podadresáři 2. Hry - šach, dáma, piškvorky, reversi, Go 3. Hádanky - křížovky - hádání na stěhování a přesuny - Rubikova kostka, pokrývání šachovnice, stěhování piána - solitéry (a: v co nejmenších tazích) - vytváření bludiště a jeho řešení - sudoku - magické čtverce Příklady - pokrytí šachovnice - vyvažování vah - odporné odpory pana Odporného - magický zapletenec