# Randomizované algoritmy

## Motivace

Mějme pole prvků, které je tvořeno stejným počtem prvků **a** a **b** v neznámém pořadí. Cílem je najít znak **a**.

Deterministicky:
- $n/2$ kroků v nejhorším případě (pokud napřed budou všechna **b**)

Randomizovaně:
- kontrola v náhodném pořadí
- s velkou pravděpodobností najdeme **a** brzy bez ohledu na vstup
- tzv. Las Vegas algoritmus

+ randomizovaný algoritmus může být jednodušší než deteministický při stejném nejhorším případě jako deterministický (např. quicksort)
+ jednoduchou deterministickou heuristikou s dobrými výsledky může být možné převést na algoritmus s dobrým nejhorším případem dodání náhodnosti (např. medián)
+ někdy náhodnost může řešit problémy, které deterministicky není možné řešit (problémy řešené orákulem) nebo se zdají nemožné

Randomizace
- vhodný nástroj pro vylepšování algoritmů, které mají špatný nejhorší případ a dobrý průměrný případ
- nejhorší případ zůstává, ale závisí na štěstí, ne na pořadí vstupních dat
- využití v kryptografii, kvantových výpočtech, hrách, simulacích, ...

## Randomizované algoritmy

- dělá nedeterministická, náhodná rozhodnutí
	- např. uvažuje vstupní data v náhodném pořadí, vybírá alternativu podle prahování na základě náhodného čísla
- v určitém momentu dělá náhodný výběr
	- inkrementální - náhodné pořadí vkládání
	- D&C - náhodný výběr vzorku
- obvykle jednodušší implementace, v praxi často rychlejší

Převod na nerandomizovaný alg.
- není jasné, jestli je to vždy možné bez zhoršení výkonu
- není znám žádný randomizovaný polynomiální algoritmus pro NP-úplné problémy
- existují problémy, kde je znám účinný randomizovaný algoritmus, ale není znám účinný deterministický algoritmus
	- a není známo, zda jde o P nebo NP problém (např. test prvočísel)

**Dělení**
- randomizované inkrementální algoritmy
	- lineární programování
- rozděl a panuj

### Vzorkování 

- nezjišťujeme hodnotu pro každou osobu nebo množinu jednotek, ale jen pro některé náhodné nebo nenáhodné
- důvody: čas a peníze
- ze vzorků odhady pro celou populaci
	- vzorek musí být dostatečně velký

**Náhodné vzorkování**
- u všech položek stejná pravděpodobnost výběru
- není zkleslení vlivem výběru jednotek do vzorku
- používáno u D&C - pro dělení použita náhodně vybraná podmnožina
- využíváno pro vyhledávácí datové stuktury a přibližná řešení
- typy
	- jednoduché
		- každá položka má stejnou šanci na zařazení do výběru
		- jednoduché, pro malé aplikace snadné, pro velké problematické
	- systematické (intervalové)
		- mezi výběry interval, 1. index vybrán náhodně
		- často v průmyslu nebo obchodu
		- výhody: dobré rozložení v populaci
		- nevýhody: úchylky ve struktuře => zkreslení výsledků
	- stratifikované
		- rozdělení populace do různých skupin (strat - věk, pohlaví, stát, ...)
		- vhodné, pokud jsou skupiny jednoduché a dobře porovnatelné, přičemž uvnitř skupiny jsou podobné názory
	- shlukované
		- rozdělit populaci na náhodný počet shluků, do vzorku zahrnout všechny jednotky vybraných shluků
			- z nevybraných shluků se nic nevybírá
		- výhody: redukce ceny, vzorek lokalizován v několika shlucích
		- nevýhody: méně přesné výsledky, větší vzorkovací chyba
	- víceúrovňové
		- jako shlukové, ale zahrnuje výběr vzorku z každého vybraného shluku (ten se nepoužije celý)
		- výběr vzorků na nejméně dvou úrovních
			- v 1. zvoleny velké skupiny
			- ve 2. jednotky
		- výhody: pohodlné, ekonomické, účinné
		- nevýhody: malá přesnost kvůli vyšší vzorkovací chybě

### Jiné dělení randomizovaných

**Monte Carlo**
- vždy dostaneme odpověď, ne vždy ale správnou
- náhodnost použita pro vedení algoritmu k řešení rychlejším způsobem s rizikem chyby
- nelze určit, zda odpověď algoritmu je správná
	- můžeme algoritmus spouštět opakovaně a srovnat výsledky
- výstup chápán jako náhodná proměnná
- příklad: ověření prvočísla
	- využijeme hledání dělitele - $a$ z intervalu $2\dots n/2$ takové, že $n$ je dělitelné $a$
	- randomizovaný algoritmus
		- vzorkuje se 10 čísel z intervalu, podle toho odpoví
- typy
	- s jednostrannou chybou
		- pouze pro rozhodovací problémy
		- neřekne ano, pokud nemá požadovanou vlastnost
		- někdy řekne ne, i když má tuto vlastnost
		- velmi praktické, drastická redukce složitosti
	- s oboustrannou chybou
		- nechat algoritmus běžet $t$-krát a vzít převažující výsledek
	- s neohraničenou chybou
		- obecný randomizovaný algoritmus
		- může potřebovat exponenciální počet běhů pro podstatný nárůst pravděpodobnosti úspěchu

**Las Vegas**
- vždy správná odpověď, ale náhodná doba běhu
- náhodnost využita k nalezení kratší cesty ke správné odpovědi
- někdy selže - vybraná cesta nevede k řešení
- složitost lze chápat jako náhodnou proměnnou
- lze jej změnit na Monte Carlo tím, že se po stanoveném čase ukončí a vydá libovolnou odpověď
- příklady
	- randomizovaný quicksort

## Náhodná čísla

- na deterministickém zařízení nelze dosáhnout úplné náhodnosti, můžeme doufat jen v pseudonáhodná čísla
- **špatný generátor** - vážné důsledky (obzvláště v kryptografii)
- nejčastěji lineární kongruentní generátor
	- $R_{n} = (aR_{n-1} + c) \mod n$
	- pro 32 bitů: $R_{0} = 0, a = 1366, c = 150889$
	- hodnoty bez znalosti teorie neměnit