# 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