# 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