126 lines
4.6 KiB
Markdown
126 lines
4.6 KiB
Markdown
|
# 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 jsou 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(0)$ v průměru pro 1 permutaci, nezávisí na $n$
|
||
|
|
||
|
## Rozděl a panuj (D&C)
|
||
|
|
||
|
- 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
|