# Data stream algoritmy - **streaming algorithm** - vstupem proud dat přicházející postupně po jedné položce - zaměženy na minulost - spočítat nějakou funkci dat + oproti tomu **online algoritmy** - jak naše rozhodnutí ovlivní budoucnost + vypadá snadné, ale nemáme místo na všechna data, jen $O(\log n)$ nebo dokonce $O(1)$ paměti - **data stream** - data přicházejí rychle, takže - obtížné předat je programu všechna - obtížné spočítat složitější funkce na velkých částech vstupu - obtížné je dočasně nebo trvale ukládat - neformálně: streaming zahrnuje - malý počet průchodů daty (obvykle jeden) - sublineární paměť - sublineární čas na výpočet (někdy) + podobné dynamickým, online, aproximačním nebo randomizovaným algoritmům, ale s více omezeními + nesměšovat s algoritmy pro vnější paměť - tam data v souborech, pomalé, ale přes všechny potíže se k nim lze dostat opakovaně, ukládat atd. Jak zvládat taková data? - **paralelizace** - často vysoce paralelizovatelné úlohy, kromě ukládání - **řízení datové rychlosti vzorkováním** - experimenty s částicemi s vysokou energií v CERNu (TB/s dat redukováno HW v reálném čase na GB/s) - **zaokrouhlení datových struktur na bloky** - např. hledání podvodů v telefonní síti - užití grafu až do velikosti 1 dne a srovnávání s přechozím dnem - **hierarchická detailní analýza** - **kladení si imaginativních otázek** - může přinést nová řešení Aplikace - sítě - např. routery - sledují pakety, cca milión za sekundu, moc velké na uložení, ale chceme spočítat např. kam jdou, kde odmítány služby atd. - databáze - sledování updatů a dotazů, chceme statistiku, např. které položky nejčastěji požadovány atd. Typická úloha - stream permutovaných čísel z $\{1\dots n\}$, jedno vyřazeno, uhodnutí které ## Data stream modely Vstupní data $a_{1}, a_{2}, \dots$ přicházejí sekvenčně, prvek po prvku, a popisují signál $A, 1D$ funkci $A:[1\dots N] \to R$. Modely se liší způsobem popisu $A$. **Time Series Model** - $a_{i} = A[i]$, objevují se v rostoucím pořadí $i$ - vhodný model pro časové pospoupnosti, kde např. sledujeme provoz na IP adrese každých 5 minut, objem burzovních obchodů každou minutu apod. **Cash Register Model** - $a_{i}$ jsou inkrementy k $A[j], a_{i} = (j, I_{i}), I_{i} \geq 0$ - tj. $A_{i}[j] = A_{i-1}[j] + I_{i}$, kde $A_{i}$ je stav signálu po shlédnuté $i$-té položky ve streamu - více $a_{i}$ může postupně inkrementovat jeden $A[j]$ + patrně nejpopulárnější model pro aplikace typu monitorování IP adres, které přistupují k webserveru - mohou přistupovat vícekrát **Turnstile Model** - $a_{i}$ jsou updaty $A[j], a_{i} = (j, U_{i})$ - tj. $A_{i}[j] = A_{i-1}[j] + U_{i}$, kde $U_{i}$ může být kladné i záporné - nejobecnější model pro apliakce typu sledování cestujících v podzemce - turniket sleduje přicházející i odcházející - vhodné pro plně dynamické úlohy - těžké získat nějaké řešení v tomto modelu + někdy $A_{i}[j] \geq 0$ - **strict Turnstile model** + tj. lidé odcházejí jen tím turniketem, kterým přišli + naopak **non-strict Turnstile model** + $A_{i}[j] < 0$ pro nějaké $i$: např. signál nad rozdílem dvou cash registerových streamů ## Příklady - náhodné vzorkování s rezervoárem - iceberg queries - počet vzájemně různých položek - konstrukce shluků (clusterů) bodů Data stream řešení - sticky sampling - lossy counting Zlepšení - sample and count - lossy counting