FAV-ZCU/KIV PRO/06. In-place a in situ algoritmy.md

47 lines
1.9 KiB
Markdown
Raw Normal View History

2024-01-25 15:24:15 +01:00
# 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