47 lines
No EOL
1.9 KiB
Markdown
47 lines
No EOL
1.9 KiB
Markdown
# In-place a in situ algoritmy
|
|
|
|
## In-place algoritmus
|
|
|
|
- narozdíl od data stream algoritmu se předpokládá vstup v poli
|
|
- transformuje datové struktury s užitím malé, $O(1)$ dodatečné paměti
|
|
- vstup během chodu programu obvykle přepsán výstupem
|
|
|
|
Příklady
|
|
- otočení řetězce
|
|
|
|
## In situ algoritmus
|
|
|
|
- někdy do in-place řazeny také algoritmy, které potřebují kromě vstupního pole $O(\log n)$ extra paměť
|
|
- pro omezená data sice pointer potřebuje $O(1)$ paměť, ale pro libovolně velká data potřebuje $O(\log n)$ bitů pro specifikaci indexů do seznamu délky $n$ - obvykle se toto ale ignoruje
|
|
- tyto algoritmy někdy označovány jako **in situ**
|
|
|
|
## Výhody in-place a in situ
|
|
|
|
- jde zpracovat větší datové množiny
|
|
- větší lokalita reference - vhodné pro paměťové hierarchie
|
|
- méně náchylné k selhání - nevyžaduje velké objemy paměti
|
|
- hodně velké datové množiny často na discích - pomalý náhodný přístup, levná dodatečná paměť, lokalita reference pak důležitější než objem dostatečné paměti
|
|
|
|
## Příklady
|
|
|
|
- Willardův 2D dělicí strom
|
|
- konvexní obálky
|
|
- Grahamovo prohledávání
|
|
|
|
## In-place a in situ sorting
|
|
|
|
1. **spojité pole**
|
|
- konstantní čas na přístup a prohození, dlouhý čas na posuvy
|
|
- pokud ignorujeme $O(\log n)$ na pointery:
|
|
- **heapsort** - ano, konstantní dodatečná paměť
|
|
- **quicksort** - in situ, $O(\log n)$ paměť na rekurzi
|
|
- **mergesort** - ne
|
|
2. zřetězené seznamy
|
|
- vyhledávání podle indexu $O(n)$
|
|
- **quicksort a heapsort**
|
|
- nutné drastické modifikace, aby alespoň $O(n^2)$
|
|
- pro tento druh algoritmů zřetěz. seznamy nevhodné
|
|
- **mergesort**
|
|
- $O(n \log n)$ čas, $O(\log n)$ dodatečná paměť
|
|
- krok merge se sřetězenými seznamy lehčí než s poli
|
|
- **mergesort** s poli - dobrá lokalita reference, pro data na disku lepší než jiné algoritmy |