Algoritmy a datové struktury 2

Při sepisování poznámek jsem hodně čerpala z Průvodce labyrintem algoritmů. Z knihy jsem přejala většinu značení a mnoho obrázků.

View source

Prohledávání řetězců

Značení

Inkrementální algoritmus

Knuth-Morris-Pratt algoritmus

barbarossa

kmpkrok

Analýza složitosti

Lemma: Funkce KmpHledej\text{KmpHledej} běží v čase Θ(S)\Theta (S)

Konstrukce automatu

Analýza složitosti

Aho-Corasicková

Automat

Aho-Corasick se zkratkovými hranami

Reprezentace

Algoritmus

ackrok

achledej

Analýza složitosti

Konstrukce automatu

ackonstrukce

Rabin–Karp

Hashovací funkce

H(x1,...,xJ)=(x1PJ1+x2PJ2+...+xJ1P1+xJP0)modN H(x_1, ..., x_J) = (x_1P^{J-1} + x_2P^{J-2}+...+x_{J-1}P^1+x_JP^0) \mod{N} H(x2,...,xJ+1)=(x2PJ1+x3PJ2+...+xJP1+xJ+1P0)modN=(PH(x1,...,xJ)x1PJ+xJ+1)modN \begin{align*} H(x_2,...,x_{J+1})&=(x_2P^{J-1} + x_3P^{J-2}+...+x_JP^1+x_{J+1}P^0) \mod{N} \\ &= (P\cdot H(x_1,...,x_J) - x_1P^J + x_{J+1}) \mod{N} \end{align*}

Algoritmus Rabin-Karp

Analýza složitosti

Toky v sítích

Síť

Definice: Síť je uspořádaná pětice (V,E,z,s,c)(V, E, z, s, c), kde:

Tok

Definice: Tok v síti je funkce f:ER0+f: E \rightarrow \R^{+}_0, pro níž platí:

  1. Tok po každé hraně je omezen její kapacitou eE:f(e)c(e)\forall e \in E : f(e) \leq c(e).

  2. Kirchhoffův zákon: Do každého vrcholu přiteče stejně, jako z něj odteče („síť těsní”).

    Výjimku může tvořit pouze zdroj a spotřebič. Formálně:

vV{z,s}:u:uvEf(uv)=u:vuEf(vu) \forall v \in V \setminus \{z, s \} : \sum_{u:uv \in E} f(uv) = \sum_{u:vu \in E} f(vu)

tok

Lemma: fΔ(z)=fΔ(s)f^{\Delta}(z) = -f^{\Delta}(s)

Ford-Fulkerson

ford-fulkerson

Konečnost

Analýza složitosti

Maximalita toku

rez_draw

fΔ(A,B)=vBfΔ(v)=fΔ(s)=f f^{\Delta}(A,B) = \sum_{v\in B}f^{\Delta}(v) = f^{\Delta}(s) = |f|

Lemma: pokud se Ford-Fulkersonův algoritmus zastaví, vydá maximální tok

Maximální párování

párování

Analýza složitosti

Dinicův algoritmus

Síť rezerv

Definice: každé hraně přiřadíme její průtok f(uv)=f(uv)f(vu)f^*(uv) = f(uv)-f(vu) (tok tam mínus tok zpět)

  1. f(uv)=f(vu)f^*(uv) = - f^*(vu)
  2. f(uv)c(uv)f^*(uv) \leq c(uv)
  3. f(uv)c(vu)f^*(uv) \geq -c(vu) – plyne z předchozích dvou
  4. pro všechny vrcholy vz,sv \neq z, s platí, že u:uvEf(uv)=0\sum_{u:uv \in E}f^*(uv) = 0
    • opět Kirchhoffův zákon – co přiteče hranami dovnitř, vyteče hranami na druhé straně ven
    • stejný vztah jako pro přebytek fΔ(v)f^{\Delta}(v) popsaný ve FF alg.
    • f(uv)=f(vu)f^*(uv) = -f^*(vu)

Lemma P (o průtoku)

Lemma Z (o zlepšování toků)

Definice: Tok je blokující, jestliže na každé orientované cestě ze zdroje do spotřebiče existuje alespoň jedna hrana, na níž je tok roven kapacitě

Definice: Síť SS je vrstevnatá (pročištěná), pokud každý vrchol i hrana leží na nějaké nejkratší cestě ze zz do ss

vrstvy

dinic

dinic_vrstvy

cisteni

blokující tok

Analýza složitosti

Goldbergův algoritmus

Vlna

Definice: Funkce f:ER0+f : E \rightarrow \R^{+}_0 je vlna v síti (V,E,z,s,c)(V,E,z,s,c), splňuje-li obě následující podmínky

  1. eE:f(e)c(e)\forall{e} \in E:f(e) \leq c(e) – vlna nepřekročí kapacity hran
  2. vV{z,s}:fΔ(v)0\forall{v} \in V \setminus \{z,s\} : f^{\Delta}(v) \geq 0 – přebytek ve vrcholu je nezáporný
    • mohou mít přebytky, ale nesmí mít deficity

Převedení vlny po hraně uvuv

Definice: převedení je nasycené, když vynuluje rezervu hrany

Algoritmus

Goldbergův algoritmus

Poznámky k implementaci

Analýza složitosti

Invariant A (základní)

  1. ff je vlna
  2. v:h(v)\forall v: h(v) neklesá
  3. h(z)=nh(z) = n a h(s)=0h(s) = 0
  4. vz:fΔ(v)0\forall v \ne z: f^{\Delta}(v) \ge 0

Invariant S (o spádu)

Lemma K (o korektnosti)

Důkaz

Invariant C (o cestě do zdroje)

Důkaz

Invariant H (o výšce)

Invariant Z (o zvednutí)

Lemma Sp (o sytých převedeních)

Důkaz

Lemma Np (o nenasycených převedeních)

Definice: potenciál ϕ:=vz,sfΔ(v>0)h(v)\phi := \sum\limits_{\substack{v \in z,s \\ f^{\Delta}(v > 0)}} h(v) – součet výšek vrcholů s přebytkem

  1. ϕ0\phi \ge 0
  2. na počátku ϕ=0\phi = 0
  3. zvednutí
    • zvýší ϕ\phi přesně o 1
    • stane se nejvýše 2n22n^2-krát
  4. Sp
    • mohlo se stát, že vv mělo předtím nulový přebytek, ale nyní jsme ho zvětšili, tedy jeho výška bude započítána do ϕ\phi
    • mohlo se stát, že uu mělo předtím nenulový přebytek, ale nyní jsme ho vynulovali, tedy jeho výška zmizí z ϕ\phi
      • ϕ\phi se zvýšil nejvýše o 2n2n
      • všechna nasycená převedení zvýší potenciál maximálně o 2n2m2n^2m
  5. Np
    • určitě se vynuluje přebytek uu, jeho výška z ϕ\phi určitě zmizí
    • možná se z nulového přebytku vv stane nenulový, tedy jeho výška bude započítána do ϕ\phi
      • ϕ\phi se snížil alespoň o 1

Vylepšení Goldbergova algoritmu

Lemma Np’

Důkaz

Rychlá Fourierova transformace

Polynomy

P(x):=j=0n1pjxj P(x) := \sum^{n-1}_{j=0}p_jx^j

Rovnost polynomů

Věta: Nechť PP, QQ jsou polynomy stupně max. dd a P(xj)=Q(xj)P(x_j) = Q(x_j) pro navzájem různá čísla x0x_0xdx_d. Potom P=QP=Q.

Lemma: Pro polynom PP stupně d0d \ge 0, počet kořenů je nejvýše dd

Důkaz věty: R:=PQR:= P-Q

Násobení

R=PQR(x)=(j=0n1pjxj)(k=0n1qkxk)=j,k=0n1pjqkxj+k=t=02n2(xt(j=0tpjqtj)) \begin{align*} R &= P\cdot Q \\\\ R(x) &= (\sum^{n-1}_{j=0}p_jx^j)\cdot (\sum^{n-1}_{k=0}q_kx^k) \\ &= \sum^{n-1}_{j, k=0}p_j \cdot q_k \cdot x^{j+k} \\ &= \sum^{2n-2}_{t=0}( x^t \cdot (\sum^t_{j = 0}p_j \cdot q_{t-j}) ) \end{align*}

Graf polynomu

(Chybné) rychlé vyhodnocování

P(x)=(p0x0+p2x2++pn2xn2)+(p1x1+p3x3++pn1xn1) P(x) = (p_0x^0+p_2x^2+\dots+p_{n-2}x^{n-2})+(p_1x^1+p_3x^3+\dots+p_{n-1}x^{n-1}) P(x)=(p0x0+p2x2++pn2xn2)+x(p1x0+p3x2++pn1xn2) P(x) = (p_0x^0+p_2x^2+\dots+p_{n-2}x^{n-2})+x\cdot(p_1x^0+p_3x^2+\dots+p_{n-1}x^{n-2}) P(x)=Ps(x2)+xPl(x2) P(x)=P_s(x^2)+x\cdot P_l(x^2) P(x)=Ps(x2)xPl(x2)s P(-x)=P_s(x^2)-x\cdot P_l(x^2)_s

Intermezzo o komplexních číslech

Algebraický tvar

Goniometrický tvar

Exponenciální tvar

Odmocniny z jedničky

Definice: ωC\omega \in \C je primitivní nn-tá odmocnina z 1 tehdy, když ω=1\omega = 1 a ω1\omega ^1ωn11\omega ^{n-1} \ne 1

FFT

FFT

F(v)k=(Ωv)k=j=0n1vjωjk \mathcal{F}(\vec{v})_k = (\Omega \cdot \vec{v})_k = \sum_{j=0}^{n-1}\vec{v}_j \cdot \omega^{j \cdot k} Ω=(111...11ω1ω2ωn11ω2ω4ωn21ωn1ωn2ω1) \Omega = \begin{pmatrix} 1 & 1 & 1 & ... & 1 \\ 1 & \omega^1 & \omega^2 & \ldots & \omega^{n-1} \\ 1 & \omega^2 & \omega^4 & \ldots & \omega^{n - 2} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & \omega^{n-1} & \omega^{n-2} & \ldots & \omega^1 \end{pmatrix}

Inverzní FFT

F1(v)k=1nj=0n1vjω(nj)k \mathcal{F}^{-1}(\vec{v})_k = \frac{1}{n}\sum^{n-1}_{j=0}\vec{v}_j\cdot \omega^{(n-j)\cdot k} Ω=(111...11ω1ω2ωn11ω1ω4ωn21ωn1ωn2ω1)Ωˉ=(111...11ωn1ωn2ω11ωn2ωn4ω21ω1ω2ωn1) \begin{align*} \Omega = \begin{pmatrix} 1 & 1 & 1 & ... & 1 \\ 1 & \omega^1 & \omega^2 & \ldots & \omega^{n-1} \\ 1 & \omega^1 & \omega^4 & \ldots & \omega^{n - 2} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & \omega^{n-1} & \omega^{n-2} & \ldots & \omega^1 \end{pmatrix} && \bar{\Omega} = \begin{pmatrix} 1 & 1 & 1 & ... & 1 \\ 1 & \omega^{n-1} & \omega^{n-2} & \ldots & \omega^1 \\ 1 & \omega^{n-2} & \omega^{n-4} & \ldots & \omega^{2} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & \omega^1 & \omega^2 & \ldots & \omega^{n-1} \end{pmatrix} \end{align*} (ΩΩˉ)jk=lΩjlΩˉlk=lωjlkl=l(ωjk)l=(wn)jk1wjk1 \begin{align} (\Omega \cdot \bar{\Omega})_{jk}=\sum_l \Omega_{jl} \cdot \bar{\Omega}_{lk} = \sum_l \omega^{jl - kl} = \sum_l (\omega^{j-k})^l = \frac{(w^n)^{j-k}-1}{w^{j-k}-1} \end{align}

Vzorkování periodických funkcí

Věta: Nechť xRn\vec{x} \in \R^n a y=F(x)\vec{y} = \mathcal{F}(\vec{x}). Potom yj=ynj\vec{y}_j = \overline{\vec{y}_{n-j}} pro všechna jj

Paralelní algoritmy

Hradlo

Boolovská hradla

Hradlové sítě

Majorita

majorita

Složení hradlových sítí

Průběh výpočtu

vrstvy majority

Posloupnosti hradlových sítí

obecný ORrychlejší obecný or

Sčítání

Paralelní sčítačka

Násobení

Násobení

Kompresor

Binární kompresor

Třídění

Komparátorová síť

Bubble sort

Paralelní bubble sort

Bitonické třídění

Definice: Posloupnost x0,,xn1x_0,\dots,x_{n-1} je čistě bitonická, pokud ji můžeme rozdělit na nějaké pozici kk na rostoucí posloupnost x0,,xkx_0,\dots,x_k a klesající posloupnost xk,,xn1x_k,\dots,x_{n-1}.

Definice: Posloupnost je bitonická, jestliže ji lze získat rotací nějaké čistě bitonické posloupnosti

Separátor

Separátor S₈

Důkaz správnosti

Důkaz funkčnosti separátoru

Bitonická třídička

Bitonická slévačka

Třídící síť

Geometrické algoritmy

Konvexní obal

Konvexní obal pro malé počty bodů

Algoritmus Konvexní obal

Orientace úhlu

u=(x1y1)v=(x2y2)M=(uv)=(x1y1x2y2)det(M)=x1y2x2y2 \begin{align*} \mathbf{u} = \begin{pmatrix} x_1 \quad y_1 \end{pmatrix} \quad \mathbf{v} = \begin{pmatrix} x_2 \quad y_2 \end{pmatrix} \\ \\ M = \begin{pmatrix} \mathbf{u} \\ \mathbf{v} \end{pmatrix} = \begin{pmatrix} x_1 \quad y_1 \\ x_2 \quad y_2 \end{pmatrix} \\ \\ \det(M) = x_1y_2-x_2y_2 \end{align*}

Determinanty různých znamének v rovině

Analýza složitosti

Průsečíky úseček

Průřez a události v kalendáři

Algoritmus průsečíky úseček

Reprezentace

Analýza složitosti

Voroného diagramy

Voroného diagram

Lokalizace bodu

Oblasti rozřezané na pásy

Analýza složitosti

Předvýpočet

Persistentní vyhledávací stromy

Persistentní AVL strom

Těžké problémy

Rozhodovací problém

Bipartitní párování

Převádění

Definice: Jsou-li AA, BB rozhodovací problémy, říkáme, že AA lze převést na BB (značíme ABA \rightarrow B) právě tehdy, když existuje funkce f:{0,1}{0,1}f: \{0, 1 \}^* \rightarrow \{0, 1 \}^* taková, že pro všechna x{0,1}x \in \{0, 1 \}^* platí A(x)=B(f(x))A(x) = B(f(x)), a navíc lze funkci ff spočítat v čase polynomiálním vzhledem k x|x|. Funkci ff říkáme převod nebo také redukce.

Lemma: Nechť ABA \rightarrow B a BB je řešitelné v polynomiálním čase, pak AA je řešitelné v polynomiálním čase

Převoditelnost jako relace

SAT

CNF

(xyz)(¬xyz)(x¬y¬z)(xy¬z) (x \or y \or z) \and (\neg x \or y \or z) \and (x \or \neg y \or \neg z) \and (x \or y \or \neg z)

3-SAT

SAT \rightarrow 3-SAT

(αβ)(αχ)(β¬χ) (\alpha \or \beta) \rightarrow (\alpha \or \chi) \and (\beta \or \neg \chi)

3,3-SAT

3-SAT \rightarrow 3,3-SAT

Nezávislá množina

3-SAT \rightarrow NzMna

(xyz)(x¬y¬z)(¬x¬yp) (x \or y \or z) \and (x \or \neg y \or \neg z) \and (\neg x \or \neg y \or p)

Nezávislá množina

NzMna \rightarrow SAT

tabulka pro NzMna

Klika

Klika v grafu a nezávislá množina v jeho hranovém doplňku

3D-párování

3D-párování

3,3-SAT \rightarrow 3D-párování

Gadget pro proměnnou

Gadget pro proměnnou

Gadget pro klauzuli

Gadget pro klauzuli

Zapojení gadgetů pro proměnné do gadgetů pro klauzule (mandatory hákáče included)

Složitostní třídy

Třída P

Definice: Problém LL leží v P\text{P} tehdy, když existuje nějaký algoritmus AA a polynom ff, přičemž pro každý vstup xx algoritmus AA doběhne v čase nejvýše f(x)f(|x|) a vydá výsledek A(x)=L(x)A(x)=L(x)

Třída NP

Definice: NP\text{NP} je třída rozhodovacích problémů, v níž problém LL leží tehdy, když existuje nějaký problém KPK \in \text{P} a polynom gg, přičemž pro každý vstup xx je L(x)=1L(x) = 1 právě tehdy, když pro nějaký řetězec yy délky nejvýše g(x)g(|x|) platí K(x,y)=1K(x,y) = 1

Třídy problémů NP

NP certifikáty

NP-hard

Definice: Problém LL je NP\text{NP}-těžký tehdy, když každý problém KNPK \in \text{NP}, lze převést na LL

NP-complete

Definice: Problém LL je NP\text{NP}-úplný tehdy, když je NP\text{NP}-těžký a navíc LNPL\in\text{NP}

Lemma: pokud LPL \in \text{P} je NP\text{NP}-těžký, pak P=NP\text{P}=\text{NP}

Cook-Levinova věta

Věta: SAT je NP\text{NP}-úplný

Lemma: Nechť LL je problém ležící v PP. Potom existuje polynom pp a algoritmus, který pro každé nn sestrojí v čase p(n)p(n) hradlovou síť BnB_n s nn vstupy a jedním výstupem, která řeší LL.

Úprava definice NP: Budeme chtít, aby nápověda yy měla pevnou velikost závislou pouze na velikosti vstupu: y=g(x)|y| = g(|x|) (napísto předchozího yg(x)|y| \le g(|x|))

NP-úplnost obvodového SATu

Obvodový SAT \rightarrow 3,SAT

NOT

hradlo NOT v CNF

AND

hradlo AND v CNF

Co s NP-úplným problémem?

  1. malé vstupy
    • stačí problém umlátit vhodně ořezaným exponenciálním algoritmem
  2. speciální vstupy
    • na stromech – většinou lineární
    • na bipartitních grafech – většinou bude existovat polynomiální algoritmus (často odvozený od toků v sítích)
  3. aproximační algoritmy – existuje docela dobrá aproximace v polynomiálním čase
    • umíme vždy dobře říct, jak daleko je aproximace od optima
  4. heuristické přístupy – v některých případech bude výsledek fajn, jindy fakt mizerný
    • neumíme říct, jak daleko je výsledek od optima
  5. kombinace
    • heuristické řešení může rozdělit problém na malé podproblémy, které řeší optimálně v exponenciálním čase
    • aproximační algoritmus si může zkusit pomoct heuristikou pro nalezení potenciálně lepšího řešení

Největší nezávislá množina ve stromu

Lemma: Je-li TT strom (funguje i pro lesy 🌲🌳) a ll jeho list, pak alespoň 1 největší nezávislá množina obsahuje ll

Algoritmus

Nezávislá množi na ve stromu

Barvení intervalového grafu

Obarvený intervalový graf

Intervalový graf:

Algoritmus

barvení intervalového grafu

Problém batohu s malými čísly

Definice: Ak(c):=A_k(c) := minimum z hmotností těch podmnožin velikosti kk, které jejichž cena je právě cc

Aproximační algoritmy

TSP – Problém obchodního cestujícího

2-aproximace

kostra TSP se zkratkami

Pozorování: TOPTT \le \text{OPT} – když z nejkratší hamiltonovské kružnice smažeme hranu, získáme minimální kostru

Nutnost trojúhelníkové nerovnosti

Věta: TSP nejde bez trojúhelníkové nerovnosti aproximovat (jinak by platilo P=NP\text{P}=\text{NP})

Problém batohu s velkými čísly

Aproximační algoritmus pro problém batohu

Analýza složitosti

Analýza chyby

c^(P)=iPc^i=iPciMcmaxiP(ciMcmax1)(iPciMcmax)n=c(P)Mcmaxnc^(P)c(P)Mcmaxn \hat{c}(P) = \sum_{i\in P}\hat{c}_i =\sum_{i\in P}\left\lfloor c_i \cdot \frac{M}{c_{max}} \right\rfloor \ge \sum_{i \in P} \left(c_i \cdot \frac{M}{c_{max}} - 1 \right) \ge \left(\sum_{i \in P} c_i \cdot \frac{M}{c_{max}} \right) - n = c(P) \cdot \frac{M}{c_{max}} - n \\ \hat{c}(P) \ge c(P) \cdot \frac{M}{c_{max}} - n c(Q)=iQciiQc^icmaxM=(iQc^i)cmaxM=c^(Q)cmaxMc^(P)cmaxMc(Q)c^(P)cmaxM c(Q) = \sum_{i\in Q}c_i \ge \sum_{i\in Q}\hat{c}_i \cdot \frac{c_{max}}{M} = \left(\sum_{i \in Q} \hat{c}_i \right) \cdot \frac{c_{max}}{M} = \hat{c}(Q) \cdot \frac{c_{max}}{M} \ge \hat{c}(P) \cdot \frac{c_{max}}{M} \\ c(Q) \ge \hat{c}(P) \cdot \frac{c_{max}}{M} c(Q)(c(P)Mcmaxn)cmaxMc(P)ncmaxn/ϵc(P)ϵcmaxc(P)ϵc(P)=(1ϵ)c(P)c(Q)(1ϵ)c(P) c(Q) \ge \left(\frac{c(P)\cdot M}{c_{max}} - n \right) \cdot \frac{c_{max}}{M} \ge c(P) - \frac{n \cdot c_{max}}{n/\epsilon} \ge c(P) - \epsilon \cdot c_{max} \ge c(P) - \epsilon \cdot c(P) = (1-\epsilon) \cdot c(P) \\ c(Q) \ge (1-\epsilon) \cdot c(P)

Aproximační schéma