# 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