-
Rozděl problém na (překrývající se) podproblémy.
-
Napiš rekurzivní algoritmus.
-
Urči správné pořadí počítání podproblémů tak, aby se každý počítal právě jednou (bottom-up přístup).
-
Pokud je to nutné, sestav z optimální hodnoty její realizaci (třeba cestu nebo něco).
-
Sepiš pseudokód.
-
Dokaž korektnost rekurentního vztahu, bottom-up pořadí a rekonstrukce (zejména terminace).
-
Okomentuj složitost.
Algoritmy a datové struktury II
Složitost
- Complexity of Problems and Algorithms
-
-
Complexity of Problems
-
Complexity of Recursive Algorithms
-
Complexity of Iterative Algorithms
-
- Amortized Complexity
-
-
Introduction
-
Aggregate Method
-
Cashier Method
-
Method of Potential Function
-
Dynamic Tables
-
- Složitost problému
-
Je zdola ohraničená dokazovaním a zhora ohraničená složitostí konkrétního algoritmu, který problém řeší.
- Amortizovaná složitost
-
Nejhorší složitost posloupnosti operací na dané datové struktuře.
Aggregační metoda
Hrubou silou sečti složitosti jednotlivých operací v posloupnosti.
Kreditová (accounting / banker’s) metoda
-
je opravdová složitost -té operace.
-
je počet "kreditů", které -tá operace stojí.
-
Pokud , pak ukládáme kredity "do zásoby".
-
Pokud , musíme doplatit rozdíl kredity, které jsme si dali do zásoby dříve.
-
Před první operací je v zásobě 0 kreditů: .
-
Kreditový invariant: V kreditové zásobě musí být vždy nezáporný počet kreditů: .
-
Amortizovaná složitost libovolné posloupnosti operací je nejvýše součet kreditové hodnoty každé z operací.
Potenciálová metoda
-
Vymysli potenciálovou funkci , která každé datové struktuře, jenž může vzniknout některou z operací, přiřadí reálné číslo.
-
Musí platit a .
-
je opravdová složitost -té operace.
-
je amortizovaná složitost -té operace.
-
Složitost libovolné posloupnosti operací je nejvýše součet amortizovaných složitostí jednotlivých operací.
Fibonacciho halda
- Fibonacci Heap
-
-
Introduction
-
Insert and Extract Min
-
Decrease Key
-
Rank
-
Meld and Delete
-
Halda s vícero stromy. Kořeny stromů jsou uloženy jako cyklický spojovaný seznam.
Každá posloupnost operací
Insert
,Extract-Min
aDecrease-Key
, která zahrnujeInsertů
, má složitost .
Původně vznikla, aby vylepšila časovou složitost Dijkstrova algoritgmu z na .
Union-Find
- Union Find
-
-
Union
-
Find
-
Analysis
-
Struktura pro vzájemně disjunktní množiny. Podporuje 3 operace:
-
Make-Set(x)
— vytvoř novou množinu obsahující jen x. -
Find(x)
— vrať kanonický element z množiny obsahující x. -
Union(x, y)
— nahraď množiny obsahující x a y jejich sjednocením.
Divide and Conquer
- Divide-and-Conquer
-
-
MinMax
-
Peaks
-
Closest Pairs
-
Rozděl problém na nezávislé podproblémy, vyřeš každý podproblém a zkombinuj jejich řešení.
Dynamické programování
- Dynamic Programming
-
-
Interval Scheduling
-
Parenthesization
-
Knapsack
-
CYK
-
Sequence Alignment
-
Bellman-Ford
-
Conclusion
-
- Problémy
-
-
Interval Scheduling (plánování přednášek)
-
Parenthesization (uzávorkování)
-
Knapsack (batoh)
-
Cocke-Younger-Kasami (CYK) (analýza bezkontextových jazyků)
-
Sequence alignment (rozdíl dvou řetězců)
-
Bellman-Forde-Moore (nejkratší cesta v orientovaném grafu)
-
Hladové (greedy) algoritmy
- Greedy Algorithms
-
-
Coins
-
Interval Scheduling
-
Interval Partitioning
-
Lateness
-
Spanning trees
-
Dijkstra
-
Inkrementálně řeší problém aplikací nějakého lokálního kritéria.
- Problémy
-
-
Coins
-
Interval Scheduling
-
Interval Partitioning
-
Lateness
-
Spanning trees
-
Dijkstra
-
Toky
- Max Flow
-
-
Ford-Fulkerson
-
Capacity Scaling
-
Shortest Augmenting Path
-
Push Relabel
-
Applications
-
- Flow network
-
Pětice , kde
-
je orientovaný graf,
-
je source (zdroj),
-
je sink (odtok),
-
, kde jsou obvykle nebo , je kapacita hrany .
-
- -řezy
-
Je rozklad vrcholů na takový, že a .
- Kapacita -řezu
-
Součet kapacit hran na rozhraní a :
- -toky
-
Funkce taková, že:
-
platí kapacitní podmínka: ,
-
platí zachování toku: .
-
- Hodnota toku
-
- Residual network
-
Síť, která vzniká, když je už část kapacity hrany využívána tokem . Umožnuje algoritmům změnit přechozí rozhodnutí a získat využitou kapacitu zpět.
Je to pětice , kde
-
,
-
pokud , ,
-
-
- Augmenting path
-
Jednoduchá cesta v residuální síti .
NoteT.j. cesta která může jít i proti směru toku . Bottleneck kapacita je nejmenší kapacita hran v augmenting path .
To krásné na augmenting cestách je, že pro flow a augmenting path v grafu , existuje tok takový, že . Nový tok lze získat takto:
Augment(f, c, P) { delta = bottleneck(P) foreach(e in P) { if(e in E) { f[e] = f[e] + delta } else { f[reverse(e)] = f[reverse(e)] - delta } } return f }
- Max-flow min-cut theorem
-
Hodnota maximálního toku je rovna kapacitě minimálního řezu.
- Ford-Fulkerson vs Goldberg
-
Ford-Fulkerson Goldberg global character
local character
update flow along an augmenting path
update flow on edges
flow conservation
preflow
Ford-Fulkersonova metoda (augmenting path method)
-
pro každou .
-
Najdi cestu v reziduální síti .
-
Augmentuj tok podél .
-
Opakuj dokud se nezasekneš.
Ford–Fulkerson(G)
{
foreach (e in E)
{
f(e) = 0
}
G_f = reziduální síť vzniklá z G vzhledem k toku f
while (existuje s ~> t cesta v G_f)
{
f = Augment(f, c, P)
Updatuj G_f
}
return f
}
Goldbergova metoda (push-relabel method)
- Pre-flow
-
Funkce taková, že
-
platí kapacitní podmínka: ,
-
platí relexováné zachování toku: .
-
- Overflowing vertex
-
Takový vertex , do kterého více přitéká než odtéká.
- Excess flow
-
To, co je v overflowing vertexu navíc.
- Height function
-
Funkce . Řekneme, že je kompatibilní s preflow , právě když
-
source: ,
-
sink: ,
-
height difference: .
NotePokud mezi dvěma vrcholy v reziduální síti vede hrana, pak je nejvýše o jednu úroveň výš než .
-
Tip
|
|
Tip
|
|
- Push operace
-
Pro (reziduálně-grafovou) hranu se pokusí přesunout excess flow z do , aniž by porušil (reziduální) kapacitu .
// Assumptions: e_f[v] > 0, c_f( (v, w) > 0) > 0, h[v] > h[w] Push(f, h, v, w) { delta_f = min(e_f[v], c_f(v, w)) if( (v, w) in E) f[(v, w)] += delta_f else f[(w, v)] -= delta_f e_f[v] -= delta_f e_f[w] += delta_f }
- Relabel operace
-
Zvýší výšku natolik, aby neporušil kompatibilitu s .
// Assumptions: // - v is overflowing: e_f[v] > 0 // - all residual neighbors of v the same height or higher: forall (v, w) in E_f: h[v] <= h[w] Relabel(f, h, v) { h[v] = 1 + min(h[w] | (v, w) in E_f) }
- Generic Push-Relabel
-
Generic-Push-Relabel(V, E, s, t, c) { // initialize preflow — default values for(v in V) { h[v] = 0 // height function e_f[v] = 0 // excess flow } n = |V| h[s] = n for(e in E) { f[e] = 0 // (pre)flow } // initialize preflow — saturate connections from s for( (s, v) in E) { f[(s, v)] = c(s, v) // preflow maxes out all capacity e_f[v] = c(s, v) // presume all of it excess e_f[s] -= c(s, v) // yes, it will be negative } // the juicy part while(any vertex is overflowing) { v = an overflowing vertex (has e_f[v] > 0) if(v has a neighbor w in G_f such that h(v) > h(w)) { Push(f, h, v, w) } else { Relabel(f, h, v) } } return f }
- Amortizovaná složitost Push-Relabel
-
operací
Push
neboRelabel
.