# 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