TIN 062 Ondej epek Sloitost I TIN 062

  • Slides: 55
Download presentation
TIN 062 Ondřej Čepek Složitost I TIN 062 Ondřej Čepek

TIN 062 Ondřej Čepek Složitost I TIN 062 Ondřej Čepek

TIN 062 Ondřej Čepek Sylabus 1. 2. 3. 4. 5. 6. 7. 8. 9.

TIN 062 Ondřej Čepek Sylabus 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Prostředky pro popis složitosti algoritmů Hladové algoritmy a souvislost s matroidy Grafové algoritmy – pokročilejší aplikace DFS a BFS DTS, NTS, prostorová a časová složitost jazyků Třídy P a NP, polynomiální transformace NP-úplnost, příklady NPÚ problémů a transformací mezi nimi Pseudopolynomiální algoritmy, silná NP-úplnost PSPACE versus NPSPACE, Savičova věta Aproximační algoritmy a aproximační schémata pro NP -těžké optimalizační úlohy Třída #P, #P-úplné úlohy (Pravděpodobnostní algoritmy – bude-li čas) 2

TIN 062 Ondřej Čepek Materiály k přednášce • Cormen, Leiserson, Rivest, Stein: Introduction to

TIN 062 Ondřej Čepek Materiály k přednášce • Cormen, Leiserson, Rivest, Stein: Introduction to algorithms (popis konkrétních algoritmů) • Arora, Barak: Computational complexity – A modern approach (třídy časové a prostorové složitosti) • Garey, Johnson: Computers and Intractability – A Guide to the Theory of NP-completeness (klasická ale dnes již trochu historická knížka o NP-úplnosti) • http: //kti. mff. cuni. cz/~cepek (promítané slajdy, příklady řešené na cvičeních, požadavky k zápočtu a zkoušce) 3

TIN 062 Ondřej Čepek Jak porovnávat algoritmy? časová složitost algoritmu oboje závisí na „velikosti“

TIN 062 Ondřej Čepek Jak porovnávat algoritmy? časová složitost algoritmu oboje závisí na „velikosti“ prostorová složitost algoritmu vstupních dat Jak měřit velikost vstupních dat? rigorózně: počet bitů nutných k zapsání vstupních dat __________________________________ Příklad: vstupem jsou (přirozená) čísla a 1, a 2, … , an která je třeba setřídit velikost dat D v binárním zápisu je |D| = log 2 a 1 + … + log 2 an __________________________________ časová složitost = funkce f(|D|) udávající počet kroků algoritmu v závislosti na velikosti vstupních dat intuitivně: není podstatný přesný tvar funkce f (multiplikativní a aditivní konstanty), ale pouze to, do jaké „třídy“ funkce f patří (lineární, kvadratická, exponenciální, …) 4

TIN 062 Ondřej Čepek Příklad: f(|D|) = a |D| + b lineární algoritmus f(|D|)

TIN 062 Ondřej Čepek Příklad: f(|D|) = a |D| + b lineární algoritmus f(|D|) = a |D|2 + b |D| + c kvadratický algoritmus f(|D|) = k 2|D| exponenciální algoritmus Co je to krok algoritmu? rigorózně: operace daného abstraktního stroje (Turingův stroj, stroj RAM) zjednodušení (někdy budeme používat): krok algoritmu = operace proveditelná v konstantním (tj. na velikosti dat nezávislém) čase • aritmetické operace (sčítání, odčítání, násobení, …) • porovnání dvou hodnot (typicky čísel) • přiřazení (pouze pro jednoduché datové typy, ne pro pole …) → tím se zjednoduší i měření velikosti dat (čísla mají pevnou maximální velikost) Příklad: setřídit čísla a 1, a 2, … , an → velikost dat je |D| = n Toto zjednodušení nevadí při porovnávání algoritmů, ale může vést k chybě při zařazování algoritmů do tříd složitosti Proč měřit časovou složitost algoritmů? stačí přeci mít dostatečně rychlý počítač … 5

TIN 062 Ondřej Čepek Doba provádění f(n) operací (délka běhu algoritmu) pro vstupní data

TIN 062 Ondřej Čepek Doba provádění f(n) operací (délka běhu algoritmu) pro vstupní data velikosti n za předpokladu že použitý hardware je schopen vykonat 1 milion operací za sekundu n f(n) 20 40 60 80 100 500 1000 n 20μs 40μs 60μs 80μs 0. 1 ms 0. 5 ms 1 ms n log n 86μs 0. 2 ms 0. 35 ms 0. 7 ms 4. 5 ms 10 ms n 2 0. 4 ms 1. 6 ms 3. 6 ms 6. 4 ms 10 ms 0. 25 s 1 s n 3 8 ms 64 ms 0. 22 s 0. 5 s 1 s 125 s 17 min 2 n 1 s n! 77 tis. let 11. 7 dní 36 tis. let 6

TIN 062 Ondřej Čepek Růst rozsahu zpracovatelných úloh, tj. „zvládnutelné“ velikosti vstupních dat, díky

TIN 062 Ondřej Čepek Růst rozsahu zpracovatelných úloh, tj. „zvládnutelné“ velikosti vstupních dat, díky zrychlení výpočtu (lepší hardware) za předpokladu, že na „stávajícím“ hardware lze řešit úlohy velikosti x Zrychlení výpočtu f(n) původní 10 krát 1000 krát n x 100 x 1000 x n log n x 7. 02 x 53. 56 x 431. 5 x n 2 x 3. 16 x 10 x 31. 62 x n 3 x 2. 15 x 4. 64 x 10 x 2 n x x+3 x+6 x+9 7

TIN 062 Ondřej Čepek Asymptotická (časová) složitost Intuitivně: zkoumá „chování“ algoritmu na „velkých“ datech,

TIN 062 Ondřej Čepek Asymptotická (časová) složitost Intuitivně: zkoumá „chování“ algoritmu na „velkých“ datech, tj. nebere v úvahu multiplikativní a aditivní konstanty, pouze zařazuje algoritmy do „kategorií“ podle jejich skutečné časové složitosti Rigorózně: f(n) je asymptoticky menší nebo rovno g(n), značíme f(n) O(g(n)), pokud c>0 n 0>0 n≥n 0 : 0 ≤ f(n) ≤ c g(n) f(n) je asymptoticky větší nebo rovno g(n), značíme f(n) Ω(g(n)), pokud c>0 n 0>0 n≥n 0 : 0 ≤ c g(n) ≤ f(n) je asymptoticky stejné jako g(n), značíme f(n) (g(n)), pokud c>0 d>0 n 0>0 n≥n 0 : 0 ≤ c g(n) ≤ f(n) ≤ d g(n) f(n) je asymptoticky ostře menší než g(n), značíme f(n) o(g(n)), pokud c>0 n 0>0 n≥n 0 : 0 ≤ f(n) ≤ c g(n) f(n) je asymptoticky ostře větší než g(n), značíme f(n) ω(g(n)), pokud c>0 n 0>0 n≥n 0 : 0 ≤ c g(n) ≤ f(n) 8

Hladové Algoritmy TIN 062 Ondřej Čepek Hladový algoritmus většinou splňuje následující podmínky: • v

Hladové Algoritmy TIN 062 Ondřej Čepek Hladový algoritmus většinou splňuje následující podmínky: • v každém kroku udělá LOKÁLNĚ optimální rozhodnutí (výběr hodnoty) • nikdy nemění již udělaná rozhodnutí („nebacktrackuje“) • pokud vždy zaručeně nalezne GLOBÁLNĚ optimální řešení tak jde o hladový optimalizační algoritmus, jinak (většinou) hovoříme o hladové heuristice Problém 1: je dán souvislý neorientovaný graf G=(V, E) a funkce d : E R+ udávající délky hran. Najděte minimální kostru grafu G, tj. acyklický podgrafu G, který má |V|-1 hran, a mezi všemi takovými podgrafy má minimálním součet délek hran. Problém 2: Je dána množina S={1, 2, … , n} úkolů jednotkové délky. Ke každému úkolu i je dána požadovaná lhůta dokončení di N+ a pokuta wi N+, kterou je úkol penalizován není-li hotov do své lhůty. Najděte rozvrh (permutaci) úkolů (od času 0 do času n), který minimalizuje celkovou pokutu za úkoly, které nejsou hotovy do jejich lhůty. Problém 3: Je dána množina S={1, 2, … , n} úkolů. Ke každému úkolu i je dán čas si N+ jeho zahájení a čas fi N+ jeho dokončení, kde si ≤ fi. Úkoly i a j jsou kompatibilní pokud se intervaly [si, fi) a [sj, fj) nepřekrývají. Najděte množinu po dvou kompatibilních úkolů, která je co největší. Plán: Navrhneme obecný hladový algoritmus řešící problémy 1 a 2 jako speciální případy a dávající návod, jak řešit Problém 3. 9

TIN 062 Ondřej Čepek Matroidy Definice: Matroid je uspořádaná dvojice M=(S, I) splňující následující

TIN 062 Ondřej Čepek Matroidy Definice: Matroid je uspořádaná dvojice M=(S, I) splňující následující tři podmínky : 1. S je konečná a neprázdná množina prvků matroidu M. 2. I je neprázdná množina podmnožiny S (nezávislých podmnožiny S), která má následující dědičnou vlastnost: pokud (B I) a (A B) tak (A I). 3. I má následující výměnnou vlastnost: pokud (A I) a (B I) takové, že (|A| < |B|) tak platí ( x B A : A {x} I). 4. Příklad 1: Maticový matroid (zdroj matroidové terminologie) • T je reálná matice řádu nxn. Pak T definuje matroid MT=(ST, IT) kde • ST je množina sloupců matice T a • A ST je nezávislá (tj. A IT) pokud A sestává z lineárně nezávislých vektorů. Příklad 2: Grafový matroid • G=(V, E) je neorientovaný graf. Pak G definuje matroid MG=(SG, IG) kde • SG=E a • A SG je nezávislá (tj. A IG) pokud A neobsahuje cyklus (tj. pokud A tvoří les). Věta: Všechny maximální nezávislé množiny v matroidu mají stejnou velikost. 10

TIN 062 Ondřej Čepek R+ a její Definice: Matroid M=(S, I) je vážený pokud

TIN 062 Ondřej Čepek R+ a její Definice: Matroid M=(S, I) je vážený pokud je dána váhová funkce w : S přirozené rozšíření na podmnožiny S je dáno předpisem A S: w(A) = x Aw(x). Matroidový Problém (MP): Pro daný vážený matroid M najděte nezávislou množinu v M s co největší váhou (taková množina se nazývá optimální množina matroidu M) Poznámka: Protože jsou všechny váhy kladné, tak je optimální množina vždy (v inkluzi) maximální nezávislou množinou. Fakt: Problém 1 je speciální případ MP Vezměme MG=(SG, IG) a pro každé e SG definujme w(e) = c - d(e), kde c je dostatečně velké číslo (libovolné c > max d(e) vyhovuje). Nyní platí: optimální množina v MG (vzhledem k w) = minimální kostra v G (vzhledem k d) Fakt : Problém 2 je speciální případ MP (toto není tak snadné jako předchozí případ) Nechť X je rozvrh všech úkolů. Úkol i nazveme : • včasným v X pokud je ukončen v čase di nebo dříve • zpožděným v X pokud je ukončen až po čase di Pozorování 1: Při hledání optimálního rozvrhu stačí uvažovat pouze ty rozvrhy, ve kterých jsou všechny včasné úkoly rozvrženy před všemi zpožděnými. Pozorování 2: Navíc lze předpokládat, že včasné úkoly jsou v rozvrhu uspořádány 11 podle neklesajících lhůt dokončení (při shodě rozhoduje například číslo úkolu).

TIN 062 Ondřej Čepek Definice: Rozvrhy splňující podmínky Pozorování 1 a 2 se nazývají

TIN 062 Ondřej Čepek Definice: Rozvrhy splňující podmínky Pozorování 1 a 2 se nazývají kanonické. Fakt: Optimální rozvrh stačí hledat v množině kanonických rozvrhů. Navíc je každý kanonický rozvrh „jednoznačně“ určen množinou svých včasných úkolů (až na permutaci zpožděných úkolů). Definice: Množina úkolů A S je nezávislá pokud existuje rozvrh X všech úkolů takový, že všechny úkoly v A jsou včasné v X. Označme IS množinu všech nezávislých podmnožiny S. Fakt: Množina včasných úkolů v libovolném kanonickém rozvrhu je nezávislá množina, což dává bijekci množiny včasných úkolů v kanonických rozvrzích nezávislé množiny A tudíž (díky výše uvedeným úvahám): minimalizace celkové pokuty rozvrhu = = minimalizace součtu vah zpožděných úkolů v kanonickém rozvrhu = = maximalizace součtu vah včasných úkolů v kanonickém rozvrhu = = nalezení nezávislé množiny s co největší váhou (nalezení optimální množiny) což je přesně MP neboť platí Věta: M=(S, IS) je matroid. 12

Hladový algoritmus pro MP TIN 062 Ondřej Čepek Nechť je dán matroid M=(S, I),

Hladový algoritmus pro MP TIN 062 Ondřej Čepek Nechť je dán matroid M=(S, I), kde S={x 1, … , xn}, a váhová funkce w : S R+. GREEDY(M, w); A : = ; setřiď a přečísluj S sestupně (do nerostoucí posloupnosti) podle vah {w(x 1)=max w(xi)}; for i : = 1 to n do if ((A {x}) I) then A : = A {x}; return A. Časová složitost: • (n logn) na setřídění • n krát test na nezávislost (složitost záleží na konkrétním matroidu) • celkem (n logn + n f(n)) kde f(n) je složitost testu na nezávislost Lemma 1: Nechť x S takový, že {x} I. Potom neexistuje A I taková, že x A. Důsledek 1: Prvky přeskočené před prvním výběrem nemohou být v žádné optimální množině. Lemma 2: (přípustnost hladového výběru) Nechť je S setříděno podle vah do nerostoucí posloupnosti a nechť je x první prvek v S pro který {x} I. Potom existuje optimální množina A I taková, že x A. 13

TIN 062 Ondřej Čepek Důsledek 2: První výběr „nezablokuje“ cestu ke konstrukci optimální množiny,

TIN 062 Ondřej Čepek Důsledek 2: První výběr „nezablokuje“ cestu ke konstrukci optimální množiny, což znamená, že v další práci může algoritmus pátrat po optimální množině pouze mezi těmi množinami prvků, které obsahují prvek x. Lemma 3: (existence optimální podstruktury) Nechť je x první prvek vybraný algoritmem GREEDY(M, w). Pak je nalezení optimální množiny v M obsahující x ekvivalentní s nalezením optimální množiny v matroidu M’=(S’, I’), kde S’ = {y S | {x, y} I} I’ = {B S’ {x} | (B {x}) I} a váhová funkce w je stejná jako u M (omezená na S’). Matroid M’ se nazývá kontrakce M prvkem x. Věta: GREEDY(M, w) vrací optimální množinu matroidu M. Důkaz (pouze zhruba): • prvky přeskočené na počátku nemohou být v žádné optimální množině (Lemma 1) • po výběru prvního prvku x Lemma 2 zaručuje existenci optimální množiny obsahující x • zbývající problém je převeden (díky Lemma 3) na problém stejného typu ale na menší množině prvků iterujeme dokud existují neprázdné nezávislé množiny 14

Hladový algoritmus pro Problém 3 TIN 062 Ondřej Čepek Nechť S={1, 2, … ,

Hladový algoritmus pro Problém 3 TIN 062 Ondřej Čepek Nechť S={1, 2, … , n} je množina úkolů, s 1, … , sn N+ jsou časy zahájení a f 1, … , fn N+ jsou časy dokončení (kde si ≤ fi). GREEDY-SELECT(s, f); A : = ; f 0 : = 0; j : = 0; setřiď a přeznač pole s a f vzestupně podle časů dokončení fi {tj. f 1=min fi}; for i : = 1 to n do if (si ≥ fj) then A : = A {i}; j : = i; return A. Časová složitost: (n logn) na setřídění, zbytek je pak (n). Lemma 1: (přípustnost hladového výběru) Existuje optimální množina (tj. kompatibilní množina úkolů maximální kardinality) která obsahuje úkol s nejmenším fi. Lemma 2: (existence optimální podstruktury) A je optimální množina pro S obsahující úkol 1 tehdy a jen tehdy, když A {1} je optimální množina pro S’ = {i | f 1 ≤ si}. Věta: GREEDY-SELECT(s, f) vrací optimální množinu pro S. Důkaz Přímý důsledek Lemma 1 a Lemma 2. 15

TIN 062 Ondřej Čepek Grafové algoritmy Značení: graf G=(V, E), V vrcholy, |V|=n, E

TIN 062 Ondřej Čepek Grafové algoritmy Značení: graf G=(V, E), V vrcholy, |V|=n, E hrany, |E|=m (budeme používat stejné značení pro orientované i neorientovaný grafy) Reprezentace grafů: budeme používat pouze seznamy sousedů (velikost dat (n+m)) Prohledávání grafů Prohledávání do šířky (BFS – breadth first search) BFS(G, s) for each u V do begin barva[u]: =bílá; d[u]: =Maxint; p[u]: =NIL end; barva[s]: =šedá; d[s]: =0; Fronta: ={s}; while Fronta neprázdná do u: =první ve Frontě; for each v je soused u do if barva[v]=bílá then begin barva[v]: =šedá; d[v]: =d[u]+1; p[v]: =u; v zařaď na konec Fronty end; barva[u]: =černá; vyhoď u z Fronty Poznámky k BFS (opakování z přednášek Programování a ADS 1): 1. Prohledává graf po vrstvách podle vzdálenosti (měřeno počtem hran) od vrcholu s 2. Běží v čase (n+m) a funguje i na orientovaném grafu (beze změny) 16

TIN 062 Ondřej Čepek Prohledávání do hloubky (DFS – depth first search) neorientovaná verze

TIN 062 Ondřej Čepek Prohledávání do hloubky (DFS – depth first search) neorientovaná verze – hlavní rozdíl proti BFS spočívá v tom, že aktivní (šedé) vrcholy nejsou ukládány do fronty ale do zásobníku, který je buď explicitně vytvářen algoritmem nebo implicitně rekurzivním voláním DFS(G) begin for i: =1 to n do begin barva[i]: =bílá; rodič[i]: =0 end; for i: =1 to n do if barva[i]=bílá then NAVŠTIV(i) end; NAVŠTIV(i) begin barva[i]: =šedá; for each j je soused i do if barva[j]=bílá then begin označ hranu (i, j) jako stromovou; rodič[j]: =i; NAVŠTIV(j) end else if (barva[j]=šedá) and (j <> rodič[i]) then označ hranu (i, j) jako zpětnou; barva[i]: =černá; end; Plán: ukážeme jak doplnit neorientovanou verzi DFS o další příkazy tak, že složitost 17 zůstane lineární ( (n+m)), ale algoritmus bude „plnit“ podstatně složitější úkol.

TIN 062 Ondřej Čepek Testování 2 -souvislosti neorientovaného grafu Definice: Nechť G=(V, E) je

TIN 062 Ondřej Čepek Testování 2 -souvislosti neorientovaného grafu Definice: Nechť G=(V, E) je souvislý neorientovaný graf. Pak 1. Vrchol v V je artikulace grafu G, pokud po odstranění v přestane být G souvislý. 2. Graf G je 2 -souvislý pokud nemá žádné artikulace. 3. Množina hran K E tvoří 2 -souvislou komponentu grafu G pokud je K v inkluzi maximální množina taková, že každé dvě hrany z K leží na prosté kružnici (tj. na kružnici bez opakování vrcholů) 4. Důsledek 1: v V je artikulace grafu G x, y V, x y takové, že každá cesta v G mezi x a y prochází vrcholem v 5. Důsledek 2: G je 2 -souvislý x, y V, x y existují alespoň dvě vrcholově disjunktní cesty v G mezi x a y (odtud pojem 2 -souvislost) 6. Algoritmy na testování 2 -souvislosti: 7. Triviální využití DFS v V otestuje, zda je graf G {v} souvislý (tj. 1 -souvislý), což lze docílit pomocí n spuštění DFS v čase (n(n+m)) = (nm) (protože G je souvislý a tedy m ≥ n-1) 2. Sofistikované využití DFS 3. v čase (n+m) = (m) rozhodne o 2 -souvislosti a zároveň označí všechny 18 artikulace a 2 -souvislé komponenty pomocí jediného spuštění „obohaceného“ DFS

TIN 062 Ondřej Čepek Fakt: Vrchol i V je artikulací tehdy a jen tehdy

TIN 062 Ondřej Čepek Fakt: Vrchol i V je artikulací tehdy a jen tehdy když buď • vrchol i není kořenem DFS stromu a má potomka j takového, že z podstromu s kořenem j nevede žádná zpětná hrana do nějakého předchůdce vrcholu i, nebo • vrchol i je kořenem DFS stromu a má alespoň dva potomky. Jak artikulace najít? DFS doplníme tak, že budeme číslovat vrcholy podle pořadí jejich objevení indexy d[i] a pro každý vrchol i navíc spočítáme funkci low[i] definovanou následovně: Definice: cestu z vrcholu i v DFS stromě nazveme přípustnou pokud vede z i „dolů“ po libovolném (případně nulovém) počtu stromových hran a poté končí nejvýše jedním „skokem vzhůru“ po zpětné hraně. Definice: low[i] = min { d[j] | z i do j vede přípustná cesta } Rekurzivní definice: low[i] = min { x, y, z } kde • x = d[i] • y = min { d[j] | hrana (i, j) je zpětná } • z = min { low[j] | hrana (i, j) je stromová } 19

Jak spočítat low[i] ? TIN 062 Ondřej Čepek 1. při objevení vrcholu i (přebarvení

Jak spočítat low[i] ? TIN 062 Ondřej Čepek 1. při objevení vrcholu i (přebarvení z bílý na šedý) inicializace low[i] : = d[i] 2. při procházení seznamu sousedů vrcholu i pokud je soused j : • bílý tak je rekurzivně navštíven (jako u obyčejného DFS) a hrana (i, j) se stává stromovou • šedý tak pokud a) j = rodič[i] (tzn. že hrana (j, i) je stromová), tak se neděje nic b) j rodič[i] (tzn. že hrana (i, j) se stává zpětnou), tak proveď update: pokud platí low[i] > d[j] tak dosaď low[i] : = d[j] • černý (tzn. že hrana (j, i) je zpětná) tak se neděje nic 3. při backtrackingu do i (návrat po stromové hraně (i, j) z j do i) proveď update: pokud platí low[i] > low[j] tak dosaď low[i] : = low[j] Jak se pozná, že vrchol i je artikulace? 1. vrchol i není kořenem DFS stromu a má potomka j takového, že d[i] low[j] (což lze testovat při backtrackingu z vrcholu j do vrcholu i) nebo 2. vrchol i je kořenem DFS stromu a má alespoň dva potomky (což budeme testovat pomocí jednoduchého triku) 20

TIN 062 Ondřej Čepek DFS-2 -SOUVISLOST(G) begin čas: =0; S: =prázdný zásobník; for i:

TIN 062 Ondřej Čepek DFS-2 -SOUVISLOST(G) begin čas: =0; S: =prázdný zásobník; for i: =1 to n do begin barva[i]: =bílá; rodič[i]: =0; d[i]: =0; kořen[i]: =false; art[i]: =false end; for i: =1 to n do if barva[i]=bílá then begin kořen[i]: =true; NAVŠTIV(i) end; NAVŠTIV(i) begin čas: =čas+1; d[i]: =čas; low[i]: =čas; barva[i]: =šedá; for each j je soused i do if barva[j]=bílá then begin označ hranu (i, j) jako stromovou a dej ji do S; rodič[j]: =i; NAVŠTIV(j); {po návratu backtracking po (i, j)} if low[i] > low[j] then low[i] : = low[j]; {update} if d[i] low[j] then {i je artikulace nebo kořen} begin if not kořen[i] then art[i]: =true; odstraň hrany z vršku S až po hranu (i, j) včetně end; {vyjmuté hrany tvoří komponentu} if kořen[i] then kořen[i]: =false end {při návratu z 2. potomka je kořen označen jako artikulace} else if (barva[j]=šedá) and (j <> rodič[i]) then begin označ hranu (i, j) jako zpětnou a dej ji do S; if low[i] > d[j] then low[i] : = d[j] {update} end; 21 barva[i]: =černá; end;

TIN 062 Ondřej Čepek Prohledávání do hloubky (DFS – depth first search) orientovaná verze

TIN 062 Ondřej Čepek Prohledávání do hloubky (DFS – depth first search) orientovaná verze (předpokládáme že graf je reprezentován pomocí seznamů sousedů) DFS(G) begin for i: =1 to n do barva[i]: =bílá; čas: =0; for i: =1 to n do if barva[i]=bílá then NAVŠTIV(i) end; NAVŠTIV(i) begin barva[i]: =šedá; čas: =čas+1; d[i]: =čas; for each j je soused i do if barva[j]=bílá then begin NAVŠTIV(j); označ (i, j) jako stromovou end else if barva[j]=šedá then begin ohlas nalezení cyklu; označ (i, j) jako zpětnou end else if d[i] < d[j] then označ (i, j) jako dopřednou else označ (i, j) jako příčnou barva[i]: =černá; čas: =čas+1; f[i]: =čas end; 22

Rovinné grafy - terminologie: TIN 062 Ondřej Čepek Definice: Neorientovaný graf G = (V,

Rovinné grafy - terminologie: TIN 062 Ondřej Čepek Definice: Neorientovaný graf G = (V, E) se nazývá rovinný pokud existuje jeho vnoření (nakreslení) do Eukleidovské roviny takové, že se žádné dvě hrany neprotínají. Platí: Pro daný graf G = (V, E) lze v čase (n+m) rozhodnout, zda je rovinný a v kladném případě zkonstruovat jeho rovinné vnoření. Definice: Nechť je G = (V, E) rovinný graf s daným rovinným vnořením. Duální graf (resp. duální multigraf) G* = (V*, E) je pak dán následovně: stěny G vrcholy G* hrany G* Poznámka: Pokud existují v G dvě stěny s více než jednou společnou hranou, tak je G* multigraf. Platí: G* je vždy souvislý. Pokud je i G souvislý, tak jsou G a G** izomorfní, a navíc v takovém případě platí stěny G* vrcholy G. Pro daný vstupní graf G lze duální graf G* zkonstruovat v čase (n+m). Lemma 1: Nechť je G = (V, E) souvislý rovinný graf s daným rovinným vnořením, nechť je G* = (V*, E) jeho duální graf a nechť E’ E. Pak podgraf (V, E’) grafu G obsahuje cyklus tehdy a jen tehdy, když podgraf (V, E E’) grafu G* není souvislý. Lemma 2: Nechť je G = (V, E), G* = (V*, E) a E’ E jsou dány jako v Lemma 1. Pak (V, E’) je kostra grafu G tehdy a jen tehdy, když (V, E E’) je kostra grafu G*. 23

TIN 062 Ondřej Čepek Definice: Rovinný graf G = (V, E) se nazývá triangulovaný

TIN 062 Ondřej Čepek Definice: Rovinný graf G = (V, E) se nazývá triangulovaný pokud je každá jeho stěna trojúhelník, tj. každá jeho stěna je omezena právě třemi hranami. Graf G’ = (V, E’) je triangulací grafu G = (V, E) pokud je G’ triangulovaný a E E’. Platí: Pokud je graf G triangulovaný, tak je jeho duální graf G* 3 -regulární. Navíc lze pro každý rovinný graf G daný (nějakým) jeho rovinným vnořením zkonstruovat (nějakou) jeho triangulaci v čase (n+m). Věta o planárním separátoru Věta: Nechť je G = (V, E) neorientovaný rovinný graf. Pak existuje rozklad V na disjunktní množiny A, B a S takové, že 1. A B S = V (každý vrchol je v některé části rozkladu) 2. (A B) E = (množina S od sebe separuje množiny A a B) 3. |A| ⅔ n 4. |B| ⅔ n 5. |S| 4 n Toto rozdělení lze navíc zkonstruovat v čase (n+m). Poznámka: BÚNO můžeme předpokládat, že G je souvislý. Důkaz: je konstruktivní, sestává z „preprocessingu“ (eliminace „jednoduchých“ případů) a pak vlastního „jádra“ důkazu 24

TIN 062 Ondřej Čepek Preprocessing Zkonstruujeme rovinné vnoření grafu G (lze v linearním čase),

TIN 062 Ondřej Čepek Preprocessing Zkonstruujeme rovinné vnoření grafu G (lze v linearním čase), vybereme libovolné s V a provedeme BFS(G) z vrcholu s. Toto BFS rozdělí V do vrstev L 0, … , Lq, kde L 0 = {s}. Dodefinujme Lq+1 = a označme |Li| = zi, i = 1, 2, … , q+1. Platí (vlastnost BFS): Nechť (x, y) E. Pak buď i: {x, y} Li nebo i: x Li a y Li 1. Z toho plyne, že i: Li je separátor oddělující A = L 0 … Li-1 a B = Li+1 … Lq+1. Definice: Nechť t je index takový, že Lt obsahuje n/2 -tý vrchol navštívený pomocí BFS. Pozorování: Pokud platí zt 4 n tak jsme hotovi. Proto předpokládejme zt > 4 n. Lemma 3: Existují indexy v < t a w > t takové, že zv n, zw n a (w – v) n. Značení: C = L 0 … Lv-1, D = Lv+1 … Lw-1, E = Lw+1 … Lq (víme |C|<n/2, |E| <n/2) Pozorování: Pokud platí |D| 2 n/3 tak jsme hotovi. Proto předpokládejme |D| > 2 n/3. Plán pro jádro důkazu: Nalezneme separátor S’ velikosti 2 n rozdělující D v poměru 2: 1 nebo vyrovnanějším. Potom definujeme: • S = S’ Lv Lw • A = (větší z dvojice C, E) (menší kus D) • B = (menší z dvojice C, E) (větší kus D) Tím budeme hotovi. 25

TIN 062 Ondřej Čepek Postup konstrukce separátoru S’ • Z grafu G odstraníme vše

TIN 062 Ondřej Čepek Postup konstrukce separátoru S’ • Z grafu G odstraníme vše kromě D a přidáme „nový“ vrchol s, který spojíme hranou s každým vrcholem v Lv+1 (graf zůstane rovinný). Získaný graf označíme G’ = (V’, E’) • Zkonstruujeme kostru T grafu G’ : a) Pro každý vrchol x Lw-1 vyber jednu hranu jdoucí z x do Lw-2 a dej ji do T b) Opakuj předchozí krok pro vrcholy ve vrstvách Lw-2 , … , Lv+2 c) Dej do T všechny hrany z s do Lv+1 • Provedeme triangulaci grafu G’, získaný graf označíme G’’ = (V’’, E’’) (platí V’’ = V’) • Vybereme cestu v T, která tvoří hledaný separátor S’ (zbytek důkazu popisuje jak) Lemma 4: x, y V’’ : cesta z x do y v kostře T má délku 2 n (T má průměr 2 n). Definice: Hrany v E’’ T (čili ty co nejsou v kostře T) se nazývají příčky grafu G’’. Označme G* = (V*, E’’) duální graf ke grafu G’’. Platí (důsledek Lemma 2): (V*, E’’ T) je kostra grafu G* (tj. příčky z G’’ tvoří kostru v G*) Platí (vlastnost kostry grafu): e = (u, v) E’’ T existuje v T právě jedna cesta z u do v, která spolu s e tvoří cyklus ce. Další postup: hledáme hranu e takovou, že cyklus ce (což je cesta v T doplňená o e) 26 tvoří požadovaný separátor, tj. cyklus ce musí „obklíčit“ něco mezi jednou třetinou a dvěmi třetinami všech vrcholů v D.

TIN 062 Ondřej Čepek Hledání vhodné hrany e • Vybereme list kostry E’’

TIN 062 Ondřej Čepek Hledání vhodné hrany e • Vybereme list kostry E’’ T grafu G*, označíme ho x* a orientujeme všechny hrany kostry směrem od x* • Provedeme DFS na kostru E’’ T z vrcholu x* a pro každou hranu e E’’ T induktivně spočítáme (v DFS stromě od listů vzhledem vzhůru, tj. při backtracku): 1. Ue = počet vrcholů grafu G’’ uvnitř cyklu ce 2. De = počet vrcholů na cyklu ce (délka cyklu ce) 3. Ce = reprezentace cyklu ce seznamem vrcholů • Tento výpočet závisí na typu hrany, musíme rozlišit 4 případy (nechť e=(f, g) E’’ T) 1. Stěna g grafu G’’ je omezena 2 hranami stromu T a 1 příčkou 2. Stěna g grafu G’’ je omezena 1 hranou stromu T a 2 příčkami a) Hrana stromu T je částí cyklu ce b) Hrana stromu T není částí cyklu ce 3. Stěna g grafu G’’ je omezena 3 příčkami Lemma 5: Existuje příčka e taková, že Ue 2 n’/3 a n’– (Ue + De) 2 n’/3 (kde n’ = |V’’|). Navíc e najdeme v průběhu práce DFS na kostře E’’ T, tj. v čase (n+m). Po nalezení hrany e zvolíme: S’ = Ce {s}, X = Ue, Y = V’’ {Ue Ce}, kde tentokrát chápeme Ue jako množinu vrcholů. Tím jsme hotovi. 27

TIN 062 Ondřej Čepek Algoritmus pro konstrukci planárního separátoru 1. Zkonstruuj vnoření G=(V, E)

TIN 062 Ondřej Čepek Algoritmus pro konstrukci planárního separátoru 1. Zkonstruuj vnoření G=(V, E) do roviny (lineárním algoritmem Hopcroft-Tarjan) 2. Proveď BFS(G) a rozděl V do vrstev L 0, … , Lq+1 3. Najdi „prostřední“ vrstvu Lt a pokud zt 4 n tak KONEC (S = Lt, A = L 0 … Lt-1, B = Lt+1 … Lq+1) 4. Najdi v < t a w > t takové, že zv n, zw n a (w – v) n a rozděl V na C = L 0 … Lv-1, D = Lv+1 … Lw-1, E = Lw+1 … Lq. Pokud |D| 2 n/3 tak KONEC (S = Lv Lw, A = největší z {C, D, E}, B = sjednocení zbývajících dvou z {C, D, E}) 5. Zkonstruuj graf G’=(V’, E’) přidáním vrcholu s k D a jeho kostru T o průměru 2 n. 6. Zkonstruuj graf G’’=(V’’, E’’) triangulací grafu G’. 7. Zkonstruuj graf G*=(V*, E’’) duální ke grafu G’’ a jeho kostru T* = E’’ T. 8. Proveď DFS(T*) z listu kostry T* a pro každou příčku e T* spočti Ue, De, Ce. 9. Najdi příčku pro kterou platí Ue 2 n’/3 a n’– (Ue + De) 2 n’/3. KONEC Nechť S’ = Ce {s}, X = Ue, Y = V’’ {Ue Ce}, kde Ue představuje množinu vrcholů. (S= Lv Lw S’, A= větší z {X, Y} menší z {C, E}, B= menší z {X, Y} větší z {C, E}) 10. 11. Každý krok trvá O(n+m) a tedy celkově algoritmus trvá (n+m). 28

Úlohy, optimalizační úlohy, rozhodovací problémy TIN 062 Ondřej Čepek Úloha = pro daný vstup

Úlohy, optimalizační úlohy, rozhodovací problémy TIN 062 Ondřej Čepek Úloha = pro daný vstup (instanci úlohy) je cílem získat výstup s danými vlastnostmi. KOSTRA: Je dán neorientovaný graf G=(V, E). Najděte v G kostru. HAMILTONOVSKÁ KRUŽNICE: Je dán neorientovaný graf G=(V, E). Najděte v G HK. Optimalizační úloha = úloha, kde je cílem získat optimální (zpravidla nejmenší / největší) výstup s danými vlastnostmi. MINIMÁLNÍ KOSTRA: Je dán neorientovaný graf G=(V, E). Najděte v G kostru minimální celkové váhy. KLIKA: Je dán neorientovaný graf G=(V, E). Najděte největší kliku (úplný podgraf maximální kardinality) v grafu G. OBCHODNÍ CESTUJÍCÍ (TSP): Je dán ohodnocený neorientovaný graf G=(V, E) s nezápornými váhami na hranách. Najděte v G Hamiltonovskou kružnici minimální celkové váhy. Rozhodovací problém = úloha, jejímž výstupem je odpověď ANO / NE SPLNITELNOST (SAT): Je dána KNF F on n Booleovských proměnných. Existuje pravdivostní ohodnocení proměnných které splňuje F ? SOUČET PODMNOŽINY (SP): Je dána množina n přirozených čísel a 1, … , an a dále přirozené číslo b. Existuje S {1, … , n} takové, že Σi Sai = b? 29

TIN 062 Ondřej Čepek V dalším výkladu se omezíme pouze na rozhodovací problémy, což

TIN 062 Ondřej Čepek V dalším výkladu se omezíme pouze na rozhodovací problémy, což není omezující podmínka, protože ke každé úloze a optimalizační úloze lze „přiřadit“ nejvýše stejně těžký (z hlediska řešitelnosti v polynomiálním čase) rozhodovací problém, takový že: • polynomiální algoritmus řešící (optimal. ) úlohu řeší i přiřazený rozhodovací problém • pokud je přiřazený rozhodovací problém „těžký“ je „těžká“ i (optimalizační) úloha Často platí i opačným směrem (ale tento směr nebývá tak snadný). Rozhodovací problém jako problém rozpoznávání jazyka Nechť P je rozhodovací problém: • předpokládáme, že každé zadání (instance) problému P je zakódována jako řetězec (slovo) v nějaké pevné abecedě Σ, tj. instance problému P = slovo ze Σ* • kódy všech instancí problému P = jazyk L(P) Σ* který se dělí na • L(P)Y = kódy instancí s odpovědí ANO • L(P)N = kódy instancí s odpovědí NE • rozhodovací problém P lze nyní formulovat takto: pro daný vstup x L(P) rozhodni zda x L(P)Y nebo x L(P)N předpokládáme, že rozhodnout zda x L(P) (tj. rozhodnout zda x kóduje nějakou instanci problému P nebo je to “nesmysl”) je možné v polynomiálním čase 30 vzhledem k |x| (tento test lze považovat za jakýsi „preprocessing“) •

Deterministický Turingův Stroj (DTS) TIN 062 Ondřej Čepek DTS je abstraktní stroj definovaný pěticí

Deterministický Turingův Stroj (DTS) TIN 062 Ondřej Čepek DTS je abstraktní stroj definovaný pěticí (Q, Σ, δ, q 0, F), který se skládá z: • řídící jednotky, která je v každém okamžiku v jednom ze stavů v konečné množině stavů Q, obsahující počáteční stav q 0 a množinu přijímacích stavů F • potenciálně nekonečné (jednosměrné) vstupní pásky (pouze pro čtení) a několika potenciálně nekonečných (jednosměrných) pracovních pásek, které sestávají z buněk, z nichž každá může obsahovat právě jeden symbol abecedy Σ • hlav pro čtení (vstupní páska) a čtení a zápis (pracovní pásky), které se mohou po páskách pohybovat oběma směry • programu, který je zadán přechodovou funkcí δ : Q Σk-1 { , , }k, kde k je počet pásek (včetně vstupní), funkce není definována pro všechny vstupy Konfigurace TS = stav řídící jednotky + pozice hlav na všech páskách (včetně vstupní) + obsah pracovních pásek (té jejich konečné části kde došlo od počátku výpočtu k nějakým změnám) Počáteční konfigurace TS = stav q 0 + všechny hlavy na počátečních pozicích + vstupní slovo na vstupní pásce a prázdná slova (prázdné symboly) na pracovních páskách Displej TS = stav řídící jednotky + symboly (obsahy buněk) pod všemi hlavami Krok TS = jedno použití přechodové funkce na základě aktuálního displeje, tj. změna stavu řídící jednotky, přepsání symbolů pod pracovními hlavami a posun všech 31 hlav (lze i zůstat na místě)

TIN 062 Ondřej Čepek Výpočet TS = posloupnost kroků TS začínající v počáteční konfiguraci

TIN 062 Ondřej Čepek Výpočet TS = posloupnost kroků TS začínající v počáteční konfiguraci Zastavení TS = okamžik kdy přechodová funkce není pro daný displej definována (vždy platí pokud je řídící jednotka v přijímacím stavu) Přijímající výpočet TS = výpočet TS, který zastaví v přijímacím stavu Odmítající výpočet TS = výpočet TS, který zastaví v jiném než přijímacím stavu nebo výpočet, který nezastaví (nekonečný výpočet) Přijímané slovo: Slovo w je přijímáno DTS M pokud výpočet M nad vstupním slovem w zastaví v přijímacím stavu. Přijímaný jazyk: Jazyk L(M) přijímaný DTS M sestává ze všech slov přijímaných DTS M. Akceptor x Transducer Dosud popisovaný TS je tzv. akceptor. Pokud chceme, aby TS počítal funkci, tak z něj uděláme transducer přidáním výstupní pásky, která je pouze pro zápis, hlava se po ní pohybuje pouze vpravo a symbol pod hlavou neovlivňuje přechodovou funkci (nepatří do displeje). Transducer může v každém svém kroku zapsat na výstupní pásku 1 symbol. Definičním oborem vyčíslované funkce je přijímaný jazyk daného TS a funkční hodnotou přiřazenou přijímanému vstupnímu slovu je obsah výstupní pásky v okamžiku zastavení. Proč zrovna TS jako výpočetní model? Přesná definice časové i prostorové složitosti výpočtu + Church-Turingova teze. 32

TIN 062 Ondřej Čepek Prostorová složitost výpočtu DTS Nechť M je DTS takový, že

TIN 062 Ondřej Čepek Prostorová složitost výpočtu DTS Nechť M je DTS takový, že w Σ* takové, že |w| = n, použije M při práci nad vstupním slovem w nejvýše S(n) buněk na pracovních páskách (prostor zabraný vstupním slovem na vstupní pásce se nepočítá). Potom říkáme, že M má prostorovou složitost S(n). Deterministická prostorová složitost jazyka Jazyk L má deterministickou prostorovou složitost S(n) pokud existuje DTS M s prostorovou složitostí S(n), který rozpoznává L, tj. takový že L(M) = L. Časová složitost výpočtu DTS Nechť M je DTS takový, že w Σ* takové, že |w| = n, udělá M při práci nad vstupním slovem w nejvýše T(n) kroků než zastaví. Potom říkáme, že M má časovou složitost T(n) Deterministická časová složitost jazyka Jazyk L má deterministickou časovou složitost T(n) pokud existuje DTS M s časovou složitostí T(n), který rozpoznává L, tj. takový že L(M) = L. Deterministické třídy časové a prostorové složitosti DSPACE(S(n)) = {L | L má deterministickou prostorovou složitost S(n)} DTIME(T(n)) = {L | L má deterministickou časovou složitost T(n)} PSPACE = i≥ 0 DSPACE(ni) P = i≥ 0 DTIME(ni) 33

TIN 062 Ondřej Čepek Nedeterministický Turingův Stroj (NTS) Všechny definice stejné jako pro DTS

TIN 062 Ondřej Čepek Nedeterministický Turingův Stroj (NTS) Všechny definice stejné jako pro DTS kromě přechodové funkce δ, která je nahrazena tabulkou δ, která přiřazuje každému displeji z množiny Q Σk množinu možných pokračování, tj. množinu z potenční množiny P(Q Σk-1 { , , }k). Definice: NTS M přijímá vstup x Σ* tehdy a jen tehdy když existuje přijímající výpočet NTS M na vstupu x (výpočet končící v qy). Jazyk L(M) přijímaný NTS M sestává ze všech vstupních slov přijímaných NTS M. Alternativní definice NTS: přidáme tzv. hádací pásku. Práce NTS pak sestává ze 2 fází: 1) Na hádací pásku je (nedeterministicky) zapsán řetězec y {1, … , k}*, kde k je maximální počet možných pokračování pro nějaký displej v tabulce δ. 2) Pomocí y je výpočet na vstupu x změněn z nedeterministického na deterministický. Vstup x je přijat pokud existuje (certifikát) y kódující přijímající výpočet. 34

Prostorová složitost výpočtu NTS TIN 062 Ondřej Čepek Nechť M je NTS takový, že

Prostorová složitost výpočtu NTS TIN 062 Ondřej Čepek Nechť M je NTS takový, že w Σ* takové, že |w| = n, použije M při práci nad vstupním slovem w nejvýše S(n) buněk na pracovních páskách (při jakémkoli z možných výpočtů M nad vstupem w). Potom říkáme, že M má prostorovou složitost S(n). Nedeterministická prostorová složitost jazyka Jazyk L má nedeterministickou prostorovou složitost S(n) pokud existuje NTS M s prostorovou složitostí S(n), který rozpoznává L, tj. takový že L(M) = L. Časová složitost výpočtu NTS Nechť M je NTS takový, že w Σ* takové, že |w| = n, udělá M při práci nad vstupním slovem w nejvýše T(n) kroků než zastaví (při jakémkoli z možných výpočtů M nad vstupem w). Potom říkáme, že M má časovou složitost T(n). Nedeterministická časová složitost jazyka Jazyk L má nedeterministickou časovou složitost T(n) pokud existuje NTS M s časovou složitostí T(n), který rozpoznává L, tj. takový že L(M) = L. Nedeterministické třídy časové a prostorové složitosti NSPACE(S(n)) = {L | L má nedeterministickou prostorovou složitost S(n)} NTIME(T(n)) = {L | L má nedeterministickou časovou složitost T(n)} NPSPACE = i≥ 0 NSPACE(ni) NP = i≥ 0 NTIME(ni) 35

TIN 062 Ondřej Čepek Konstruovatelnost funkcí Definice: Funkce f : N N je rekurzivní

TIN 062 Ondřej Čepek Konstruovatelnost funkcí Definice: Funkce f : N N je rekurzivní tehdy a jen tehdy, když existuje DTS transducer s jednoprvkovou vstupní abecedou takový, že pro vstup 1 n (n znaků na vstupní pásce). dává výstup 1 f(n) (f(n) znaků na výstupní pásce). Definice: Funkce f : N N je vyčíslitelná v lineárním čase tehdy a jen tehdy, když je rekurzivní a existuje konstanta c a DTS transducer s jednoprvkovou vstupní abecedou takový, že na vstupu 1 n udělá nejvýše cf(n) kroků než vydá výstup 1 f(n). Definice: Funkce f : N N je časově konstruovatelná tehdy a jen tehdy, když existuje DTS takový, že pro každý vstup délky n zastaví po právě f(n) krocích. Platí: Předchozí dvě definice jsou ekvivalentní (u časové složitosti budeme vždy předpokládat f(n) ≥ n+1). Každá polynomiální funkce je časově konstruovatelná. Definice: Funkce f : N N je vyčíslitelná v lineárním prostoru tehdy a jen tehdy, když je rekurzivní a existuje konstanta c a DTS transducer s jednoprvkovou vstupní abecedou takový, že na vstupu 1 n použije nejvýše cf(n) buněk na pracovních páskách než vydá výstup 1 f(n). Definice: Funkce f : N N je prostorově konstruovatelná tehdy a jen tehdy, když existuje DTS takový, že pro každý vstup délky n použije (označí) právě f(n) buněk na pracovních páskách než zastaví. Platí: Předchozí dvě definice jsou ekvivalentní. Každá polynomiální funkce je prostorově 36 konstruovatelná.

NP-těžkost a NP-úplnost TIN 062 Ondřej Čepek Definice: Funkce f : {0, 1}* je

NP-těžkost a NP-úplnost TIN 062 Ondřej Čepek Definice: Funkce f : {0, 1}* je polynomiálně vyčíslitelná tehdy a jen tehdy, když existuje polynom p a DTS transducer A takový, že pro každý vstup x {0, 1}* dává DTS transducer A výstup f(x) po vykonání nejvýše p(|x|) kroků. Definice: Jazyk L nad abecedou {0, 1} je polynomiálně převoditelný na jazyk L’ nad {0, 1} (značíme L L’) tehdy a jen tehdy, když existuje polynomiálně vyčíslitelná funkce f taková, že x {0, 1}*: (x L) (f(x) L’). Definice: Problém P je NP-těžký tehdy a jen tehdy, když Q NP : L(Q)Y L(P)Y. Problém P je NP-úplný tehdy a jen tehdy, když je P NP-těžký a navíc P NP. NP Definice: Problém P je co-NP-těžký tehdy a jen tehdy, když Q co-NP : L(Q)N L(P)N. Problém P je co-NP-úplný tehdy a jen tehdy, když je P co-NP-těžký a navíc P co-NP Důsledek: Pokud je Q NP-těžký a L(Q)Y L(P)Y, pak také P je NP-těžký. Obdobně, pokud je Q co-NP-těžký a L(Q)N L(P)N, pak také P je co-NP-těžký. Toto je standardní postup jak dokazovat NP-těžkost (resp. co-NP-těžkost), který ovšem vyžaduje existenci alespoň jednoho NP-těžkého (resp. co-NP-těžkého) problému. Věta (Cook-Levin 1971): Existuje NP-úplný problém. Poznámka: Původní důkaz je udělán problém splnitelnosti booleovských formulí zadaných v KNF, my použijeme jiný rozhodovací problém. 37

TIN 062 Ondřej Čepek Kachlíkování: Zadání: množina barev B, čtvercová síť S s obvodem

TIN 062 Ondřej Čepek Kachlíkování: Zadání: množina barev B, čtvercová síť S s obvodem obarveným barvami z B, množina K typů kachlíků, kde je každý typ definován svou horní, dolní, levou a pravou barvou. Otázka: Lze síť S vykachlíkovat pomocí kachlíků z množiny K (stejný typ lze použít libovolně krát, kachlíky ale nelze otáčet) tak, aby a) barvy kachlíků přilehlé k obvodu sítě souhlasily s barvami předepsanými tomto na obvodu sítě a b) každá dvojice barev na dotyku dvou kachlíků byla rovněž shodná? Věta: Kachlíkování je NP-úplné. Důkaz: 1) Kachlíkování je v NP – to je zřejmé 2) Kachlíkování je NP-těžké – dokážeme z definice třídy NP Nechť R NP libovolný a nechť M je NTS program rozpoznávající L(R)Y v čase shora omezeném polynomem p (tj. x L(R)Y skončí každý přijímající výpočet stroje M na vstupu x po nejvýše p(|x|) krocích). Navíc předpokládejme, že M přijímá „s prázdnou páskou“ (po přechodu do stavu q. Y neskončí práci, ale vše na pásce přepíše prázdným symbolem, hlavu „zaparkuje“ na začátku pásky a přejde do „nového“ koncového stavu). Nechť je M definován množinou stavů Q, vstupní abecedou Σ={0, 1}, pracovní abecedou Γ ={0, 1, *} (abecedy lze případně překódovat) a přechodovou tabulkou δ. Nechť zadání x {0, 1}* problému R, kde |x|=n, je vstupem programu M. Zkonstruujeme zadání f(x) problému Kachlíkování takové, že x L(R)Y tehdy a jen tehdy, když f(x) L(Kachlíkování)Y 38

TIN 062 Ondřej Čepek Splnitelnost (SAT): Zadání: KNF F na n Booleovských proměnných. Otázka:

TIN 062 Ondřej Čepek Splnitelnost (SAT): Zadání: KNF F na n Booleovských proměnných. Otázka: Existuje pravdivostní ohodnocení proměnných, které splňuje formuli F? Věta: SAT je NP-úplný. Důkaz: Transformace Kachlíkování SAT. 3 -SAT: Zadání: Kubická KNF F na n Booleovských proměnných. Otázka: Existuje pravdivostní ohodnocení proměnných, které splňuje formuli F? Věta: 3 -SAT je NP-úplný. Důkaz: Transformace SAT 3 -SAT. 3 -Barvení Grafu (3 -BG): Zadání: Neorientovaný graf G=(V, E). Otázka: Lze obarvit vrcholy ve V třemi barvami tak, aby žádná hrana v E nebyla monochromatická? Věta: 3 -BG je NP-úplný. Důkaz: Transformace 3 -SAT 3 -BG. Klika (KL): Zadání: Neorientovaný graf G=(V, E) a přirozené číslo k. Otázka: Existuje V’ V, |V’| = k, indukující úplný podgrafu G? Věta: KL je NP-úplný. Důkaz: Transformace SAT KL. 39

TIN 062 Ondřej Čepek Nezávislá Množina (NM): Zadání: Neorientovaný graf G=(V, E) a přirozené

TIN 062 Ondřej Čepek Nezávislá Množina (NM): Zadání: Neorientovaný graf G=(V, E) a přirozené číslo q. Otázka: Existuje V’ V, |V’| = q, taková, že uvnitř V’ nejsou žádné hrany? Věta: NM je NP-úplný. Důkaz: Transformace KL NM. Vrcholové Pokrytí (VP): Zadání: Neorientovaný graf G=(V, E) a přirozené číslo r. Otázka: Existuje V’ V, |V’| = r, taková, že každá hrana má ve V’ alespoň jeden vrchol? Věta: VP je NP-úplný. Důkaz: Transformace NM VP. Hamiltonovská Kružnice (HK): Zadání: Neorientovaný graf G=(V, E). Otázka: Obsahuje G Hamiltonovskou kružnici, tj. jednoduchou kružnici, která prochází každým vrcholem právě jednou? Věta: HK je NP-úplný. Důkaz: Transformace VP HK. Obchodní Cestující (TSP): Zadání: Úplný neorientovaný graf G=(V, E), váhy w : E Z 0+ , a číslo k Z+. Otázka: Existuje v G Hamiltonovská kružnice s celkovou váhou nejvýše k? Věta: TSP je NP-úplný. Důkaz: Transformace HK TSP. 40

TIN 062 Ondřej Čepek Součet Podmnožiny (SP): Zadání: Čísla a 1, … , an,

TIN 062 Ondřej Čepek Součet Podmnožiny (SP): Zadání: Čísla a 1, … , an, b Z+. Otázka: Existuje množina indexů S {1, … , n}, taková, že Σi Sai = b? Věta: SP je NP-úplný. Důkaz: Transformace VP SP. Algoritmus pro SP: předpokládejme, že platí a 1 ≥ … ≥ an , a že A je pole délky b. for j : = 1 to b do {A[j] : = 0; a 0 : = b+1}; for i : = 1 to n do A[ai] : = 1; for j : = b downto ai-1 do if (A[j] = 1) and (j+ai ≤ b) then A[j+ai] : = 1; SP : = (A[b] = 1). Platí: Po i-tém průchodu hlavním cyklem obsahuje pole A jedničky právě u těch indexů, které odpovídají součtům všech neprázdných podmnožiny {a 1, … , ai}, které jsou nejvýše rovny b. Časová složitost: O(nb), což je • exponenciální časová složitost vzhledem k binárně (ale také ternárně, dekadicky, …) kódovanému vstupu, ale • polynomiální časová složitost vzhledem k unárně kódovanému vstupu. Algoritmy s těmito vlastnostmi se nazývají pseudopolynomiální. 41

TIN 062 Ondřej Čepek Pseudopolynomiální algoritmy Nechť je dán rozhodovací problém Q a jeho

TIN 062 Ondřej Čepek Pseudopolynomiální algoritmy Nechť je dán rozhodovací problém Q a jeho instance X. Definujme: kód(X) = délka zápisu (počet bitů) instance X v binárním (či „vyšším“) kódovaním max(X) = největší číslo v X (velikost čísla, NE délka jeho binárního zápisu) Definice: Algoritmus řešící Q se nazývá pseudopolynomiální, pokud je jeho časová složitost při spuštění na vstupu X omezena polynomem v proměnných kód(X) a max(X). Poznámka: každý polynomiální algoritmus je samozřejmě také pseudopolynomiální. Pozorování: Pokud je Q takový, že pro každou jeho instanci X platí max(X) p(kód(X)) pro nějaký (pevný) polynom p, tak pro Q pojem polynomiálního a pseudopolynomiálního algoritmu splývá. Problémy, kde toto nenastává budeme nazývat číselné problémy. Definice: Rozhodovací problém Q se nazývá číselný, pokud neexistuje polynom p takový, že pro každou instanci X problému Q platí max(X) p(kód(X)). Věta: Nechť Q je NP-úplný problém, který není číselný. Potom pokud P NP, NP tak Q nemůže být řešen pseudopolynomiálním algoritmem. Otázka: Je každý číslený problém řešitelný nějakým pseudopolynomiálním algoritmem? Odpověď: NE (a typickým představitelům takových problémů se říká silně NP-těžké) 42

Silně NP- úplné problémy TIN 062 Ondřej Čepek Nechť je Q rozhodovací problém a

Silně NP- úplné problémy TIN 062 Ondřej Čepek Nechť je Q rozhodovací problém a p polynom. Symbolem Qp označíme množinu instancí problému Q (tj. podproblému Q), pro které platí max(X) p(kód(X)), tj. Qp = {X Q | max(X) p(kód(X))} Věta: Nechť je A pseudopolynomiální algoritmus řešící Q. Potom pro každý polynom p je A polynomiálním algoritmem řešícím Qp. Definice: Rozhodovací problém Q se nazývá silně NP-úplný, pokud Q NP a existuje polynom p takový, že podproblém Qp je NP-úplný. Věta: Nechť Q je silně NP-úplný problém. Potom pokud P NP, NP tak Q nemůže být řešen pseudopolynomiálním algoritmem. Příklady číselných silně NP-úplných problémů: Obchodní Cestující (TSP) : • je to číselný problém (váhy na hranách mohou být libovolně velké) • je silně NP-úplný neboť zůstává NP-úplný i když váhy omezíme (malou) konstantou 3 -partition (3 -P) – toto je „čistě“ číselný problém : Zadání: a 1, … , a 3 m, b N, taková že j : ¼ b < aj < ½ b a platí Σj=13 m aj = mb. Otázka: S 1, … , Sm disjunktní rozdělení množiny {1, … , 3 m} takové, že i : Σj Si aj = b? 43

TIN 062 Ondřej Čepek Vztah determinismu a nedeterminismu prostorovou složitost Věta (Savičova): Nechť S

TIN 062 Ondřej Čepek Vztah determinismu a nedeterminismu prostorovou složitost Věta (Savičova): Nechť S : N N je prostorově konstruovatelná funkce taková, že n platí S(n) ≥ log n. Potom existuje konstanta c, pro kterou NSPACE(S(n)) DSPACE(c S 2(n)). Důkaz: Nechť L NSPACE(S(n)) a M je NTS přijímající L v prostoru S(n). Ukážeme, že: • konst. d taková, že na vstupu w délky n má M nejvýše 2 d S(n) konfigurací (množina K) • pokud M přijímá vstup w délky n, tak existuje přijímající výpočet délky nejvýše 2 d S(n) Označme: (K 1, K 2, i) pokud lze z konfigurace K 1 K přejít do konfigurace K 2 K pomocí nejvýše 2 i kroků stroje M. Při hledání přijímacích výpočtů (z iniciální konfigurace do přijímajících konfigurací) se stačí omezit na i ≤ d S(n). Simulace práce NTS M na vstupu w délky n na DTS pro iniciální konfiguraci K 0 K a každou přijímající konfiguraci Kp K proveď : if TEST(K 0, Kp, d S(n)) then přijmi w, kde TEST je procedura implementovaná na DTS TEST(K 1, K 2, i) if (i=0) and ((K 1=K 2) or (z K 1 lze přejít jedním krokem do K 2)) then return TRUE; if (i>0) then for K K do if TEST(K 1, K, i -1) and TEST(K, K 2, i -1) then return TRUE; return FALSE Platí: simulace na DTS proběhne v prostoru c S 2(n). Důsledek: PSPACE = NPSPACE 44

TIN 062 Ondřej Čepek Aproximační algoritmy jsou typicky používány na řešení “velkých” instancí NP-těžkých

TIN 062 Ondřej Čepek Aproximační algoritmy jsou typicky používány na řešení “velkých” instancí NP-těžkých optimalizačních problémů, pro které je nalezení optimálního řešení “beznadějné”, tj. časově příliš náročné (pro “malé” instance lze nalézt optimální řešení “hrubou silou” v exponenciálním čase). Aproximační algoritmus má následující tři vlastnosti: 1. Vrací (většinou) suboptimální řešení (někdy ale může vrátit i optimum). 2. Dává odhad kvality vráceného řešení vzhledem k optimu. 3. Běží v polynomiálním čase vzhledem k velikosti zadání. 4. Odhad kvality vráceného řešení 5. Značení: OPT = optimální řešení 6. APR = řešení vrácené aproximačním algoritmem 7. f(Z) = hodnota řešení Z (předpokládáme, že je vždy nezáporná) 8. Definice: Aproximační algoritmus A řeší optimalizační problém X s poměrovou chybou r(n), pokud pro všechna zadání problému X velikosti n platí 9. max { f(APR) / f(OPT) , f(OPT) / f(APR) } r(n). 10. Definice: Aproximační algoritmus A řeší optimalizační problém X s relativní chybou e(n), pokud pro všechna zadání problému X velikosti n platí 45 11. |f(APR) f(OPT)| / f(OPT) e(n).

TIN 062 Ondřej Čepek Příklad maximalizačního problému (optimalizační verze Kliky): Pro daný neorientovaný graf

TIN 062 Ondřej Čepek Příklad maximalizačního problému (optimalizační verze Kliky): Pro daný neorientovaný graf najít největší (měřeno počtem vrcholů) kliku v daném grafu. Aproximační algoritmus by musel poskytovat odhad (záruku kvality) tohoto typu f(APR) ¾ f(OPT), kde f(X) je v tomto případě počet vrcholů (tj. velikost kliky) v řešení X. Příklad minimalizačního problému (optimalizační verze Obchodního cestujícího): Pro daný úplný vážený neorientovaný graf najít nejkratší Hamiltonovskou kružnici (měřeno součtem délek hran) v daném grafu. Aproximační algoritmus by musel poskytovat odhad (záruku kvality) tohoto typu f(APR) ≤ 2 f(OPT), kde f(X) je v tomto případě délka Hamiltonovské kružnice v řešení X. Příklady aproximačních algoritmů Úloha vrcholového pokrytí (optimalizační verze): Vstup: Neorientovaný graf G = (V, E). Úloha: Najít vrcholové pokrytí minimální velikosti, tj. najít V’ V takové, že pro každé (u, v) E platí u V’ nebo v V’ (nebo oboje), a navíc V’ má minimální možnou 46 kardinalitu.

TIN 062 Ondřej Čepek Algoritmus A: opakovaně vyber v grafu vrchol nejvyššího stupně, přidej

TIN 062 Ondřej Čepek Algoritmus A: opakovaně vyber v grafu vrchol nejvyššího stupně, přidej ho do postupně konstruovaného vrcholového pokrytí a odstraň ho z grafu spolu se všemi incidentními (a tedy pokrytými) hranami dokud nezbývá v grafu žádná hrana. Má Algoritmus A konstantní relativní (poměrovou) chybu? Algoritmus B: opakovaně vyber v grafu libovolnou hranu (u, v) dej jak u tak v do postupně konstruovaného vrcholového pokrytí a odstraň jak u tak v z grafu spolu se všemi incidentními (a tedy pokrytými) hranami dokud nezbývá v grafu žádná hrana. Má Algoritmus B konstantní poměrovou chybu? Úloha obchodního cestujícího (optimalizační verze): Vstup: Úplný vážený neorientovaný graf G = (V, E) a váhová funkce c : E Z+ {0} Úloha: Najít v G Hamiltonovskou kružnici nejmenší celkové váhy (délky). 1. Obchodní cestující s trojúhelníkovou nerovností Platí: u, v, w V : c(u, w) ≤ c(u, v) + c(v, w) Napřed nutno zjistit: Je tento podproblém vůbec NP-těžký (a má tedy vůbec cenu uvažovat o aproximačních algoritmech)? ? 47

TIN 062 Ondřej Čepek Algoritmus C: a) Najdi minimální kostru grafu G. b) Vyber

TIN 062 Ondřej Čepek Algoritmus C: a) Najdi minimální kostru grafu G. b) Vyber libovolný vrchol grafu G a spusť z něj na nalezené kostře DFS, které očísluje vrcholy v preorder pořadí c) Výsledná Hamiltonovská kružnice je dána pořadím (permutací) z bodu b) Poznámka: Pokud je v bodě a) použit Primův (Jarníkův) algoritmus, tak celý algoritmus běží v čase O(|E|) = O(|V|2). Věta: Algoritmus C má konstantní poměrovou chybu r(n) ≤ 2. Obchodní cestující bez trojúhelníkové nerovností Věta: Nechť R 1 je libovolná konstanta. Potom pokud P NP, NP tak neexistuje polynomiální aproximační algoritmus řešící obecný případ obchodního cestujícího poměrovou chybou nejvýše R. s Důsledek (o existenci neaproximovatelných úloh): Existují NP-těžké optimalizační úlohy, pro které neexistují polynomiální aproximační algoritmy s konstantní poměrovou chybou (pokud P NP). NP Opačný případ: Existují NP-těžké optimalizační úkoly, které lze aproximovat s libovolně malou relativní chybou (poměrovou chybou libovolně blízko 1) s tím, že čím menší je požadovaná chyba tím vyšší je časová složitost aproximačního algoritmu. 48

TIN 062 Ondřej Čepek Aproximační schémata Definice: Aproximační schéma (AS) pro optimalizační úlohu X

TIN 062 Ondřej Čepek Aproximační schémata Definice: Aproximační schéma (AS) pro optimalizační úlohu X je algoritmus, jehož vstupem je zadání Y úlohy X a (racionální) číslo e>0, který pro libovolné pevné e pracuje jako aproximační algoritmus pro úlohu X s relativní chybou e. Poznámka: Doba běhu může být exponenciální jak ve velikosti zadání Y tak v 1/e. Definice: Polynomiální aproximační schéma (PAS) pro optimalizační úlohu X je AS, jehož časová složitost je polynomiální vzhledem k velikosti zadání Y úlohy X. Poznámka: Doba běhu může být stále ještě exponenciální vzhledem k 1/e. Definice: Úplně polynomiální aproximační schéma (ÚPAS) pro optimalizační úlohu X je PAS, jehož časová složitost je polynomiální také vzhledem k k 1/e. Úloha součtu podmnožiny (optimalizační verze): Vstup: Množina přirozených čísel A = {x 1, … , xn} a přirozené číslo t. Úloha: Najít množinu indexů S {1, … , n} takovou, že sum = i S xi je co největší při platnosti podmínky sum ≤ t. 1. Pseudopolynomiální algoritmus pro SP 2. Značení: Nechť L je uspořádaný seznam přirozených čísel a 1, … , an. Pak L+x, kde x je přirozené číslo je uspořádaný seznam přirozených čísel a 1+x, … , an+x. 49

TIN 062 Ondřej Čepek SOUČET(A, t) begin L 0 : = (0); { seznam

TIN 062 Ondřej Čepek SOUČET(A, t) begin L 0 : = (0); { seznam délky 1 obsahující číslo 0 } for i : = 1 to n do Li : = MERGE(Li-1, Li-1 + xi); { MERGE slije oba seznamy, čísla větší než t zahodí } řešení : = největší prvek v Ln end. Věta: Seznam Li pro 1 ≤ i ≤ n je uspořádaný seznam obsahující součty všech podmnožiny A = {x 1, … , xn}, které jsou menší nebo rovny číslu t. Důkaz: indukcí podle i Časová složitost: • v každém případě O(|L 1| + … + |Ln|) • pokud jsou v seznamech drženy duplicitní hodnoty tak (v nejhorším případě) Ω(2 n) • ale pokud jsou duplicity v MERGE vyházeny, tak O(n t) • algoritmus je polynomiální pokud t ≤ p(n) nebo i: xi ≤ p(n) pro nějaký polynom p 2. Prořezávání seznamů Nechť je dáno 0 < d < 1. Prořezat seznam L parametrem d znamená odebrat z L co nejvíce prvků tak, že pro každý odstraněný prvek y existuje v prořezaném seznamu L’ 50 prvek z takový, že (1 - d) y ≤ z ≤ y.

PROŘEŽ(L, d) begin L’ : = (y 1); poslední : = y 1; for

PROŘEŽ(L, d) begin L’ : = (y 1); poslední : = y 1; for i : = 2 to |L| do if poslední < (1 -d)yi then begin L’ : = L’ { yi }; poslední : = yi end; return L’ end. Časová složitost: (|L|) TIN 062 Ondřej Čepek 3. ÚPAS pro SP Vstup: Množina přiroz. čísel A = {x 1, … , xn}, přirozené číslo t a aproximační parametr e. APPROX-SP(A, t, e) begin L 0 : = (0); { seznam délky 1 obsahující číslo 0 } for i : = 1 to n do begin. Li : = MERGE(Li-1, Li-1 + xi); { MERGE slije oba seznamy, čísla větší než t zahodí } Li : = PROŘEŽ (Li, e/n); end; řešení : = největší prvek v Ln end. 51 Časová složitost: (|L 1| + … + |Ln|)

TIN 062 Ondřej Čepek Myšlenka: Opakovaným prořezáváním se chyba může postupně zvětšovat, ale e/n

TIN 062 Ondřej Čepek Myšlenka: Opakovaným prořezáváním se chyba může postupně zvětšovat, ale e/n je dostatečně malý „prořezávací parametr“, aby celková relativní chyba „nasčítaná“ přes n iterací byla nejvýše e. Věta: Algoritmus APPROX-SP je ÚPAS pro optimalizační úlohu SP. Značení: y* = optimální hodnota z = hodnota vrácená algoritmem APPROX-SP Cíl 1: Chceme ukázat, že (1 – e ) y* ≤ z ≤ y*. Lemma: Nechť y ≤ t je součet nějaké podmnožiny {x 1, … , xi}. Pak na konci i-té iterace algoritmu APPROX-SP existuje w Li (tj. w je v prořezaném seznamu Li) takové, že platí (1 – e/n)i y ≤ w ≤ y. Důsledek: Existuje w Ln takové, že (1 – e/n)n y* ≤ w ≤ y* a číslo z vrácené algoritmem APPROX-SP je největší takové w. Lemma: n > 1 platí (1 – e) < (1 – e/n)n a tudíž (1 – e ) y* ≤ z ≤ y* (Cíl 1 splněn). Cíl 2: Víme, že časová složitost APPROX-SP je (|L 1| + … + |Ln|) a chceme ukázat, že je také O(p(n, log t, 1/e)) pro nějaký polynom p ve třech proměnných. Lemma: i : |Li| ≤ (n ln t) / e Důsledek: Algoritmus APPROX-SP má časovou složitost O((n 2 log t) / e) (Cíl 2 splněn). 52

Početní úlohy TIN 062 Ondřej Čepek Rozhodovací problémy: ptáme se na existenci řešení (certifikátů)

Početní úlohy TIN 062 Ondřej Čepek Rozhodovací problémy: ptáme se na existenci řešení (certifikátů) Početní úlohy: ptáme se na počet řešení (certifikátů) Nechť: Σ je abeceda na kódování zadání úlohy a Γ je abeceda na kódování certifikátů Definice: Funkce w : Σ* P(Γ*), kde P(Γ*) je potenční množina množiny Γ*, se nazývá certifikační funkce pro Σ a Γ. Každý prvek množiny y w(x) Γ* se nazývá certifikát pro zadání x Σ*. Rozhodovací problém Aw asociovaný s certifikační funkcí w je definován předpisem Aw = {x Σ* | w(x) ≠ }. Poznámka: V Aw jsou právě ta zadání, pro která existuje alespoň jeden certifikát, tj. pro která je odpověď na rozhodovací verzi daného problému ANO. Definice: Třída #P je množina certifikačních funkcí w takových, že 1) Existuje deterministický algoritmus, který pro každé x Σ* a y Γ* ověří v polynomiálním čase (vzhledem k |x| + |y|) jestli y w(x). 2) Existuje polynom p takový, že y w(x) : |y| ≤ p(|x|) (pro různá w různá p). 3) Věta (o vztahu #P a NP): NP a) Pokud w #P tak potom Aw NP. b) Pokud A NP tak potom w #P : A = Aw. 53

TIN 062 Ondřej Čepek Pozorování: Pokud w #P je taková, že x Σ* lze

TIN 062 Ondřej Čepek Pozorování: Pokud w #P je taková, že x Σ* lze v polynomiálním čase spočítat |w(x)|, tak lze x Σ* v polynomiálním čase rozhodnout zda x Aw (tj. vyřešit asociovaný problém ze třídy NP) i zda x (P(Σ*) Aw) (tj. vyřešit doplňkový problém ze třídy co-NP). Důsledek: Početní úlohy (#SAT, #Klika, #SP …) odpovídající NPÚ rozhodovacím problémům (SAT, Klika, SP …) jsou alespoň tak těžké jako dané rozhodovací problémy. Otázka: Lze pro třídu #P zavést analogii polynomiálních transformací a úplnosti úloh ? ? Definice: Nechť w : Σ* P(Γ*) a v : Π* P(Δ*), jsou certifikační funkce z třídy #P. #P Polynomiální redukce z w na v je dvojice funkcí vyčíslitelných v polynomiálním čase : Σ* Π* a φ : N N takových, že x Σ* : |w(x)| = φ|v(σ(x))|. σ Terminologie: Pokud je funkce φ identita (tj. n N : φ(n) = n), tak se příslušná redukce nazývá šetrná. Definice: Certifikační funkce v je #P-úplná pokud (i) v #P a (ii) w #P existuje polynomiální redukce z w na v. Věta: #Kachlíkování je #P-úplná úloha. Důkaz: Vyplývá z důkazu Cook-Levinovy věty (ne zcela triviálně, trocha práce je nutná). Věta: #SAT je #P-úplná úloha. Důkaz: Vyplývá z transformace Kachlíkování SAT, která definuje šetrnou redukci. Věta: #3 -SAT, #Klika, #SP jsou #P-úplné úlohy. 54 Důkaz: Mírnými úpravami transformací dokazujících NP-úplnost získáme šetrné redukce.

TIN 062 Ondřej Čepek Víme: Pro w #P a x Σ* spočítat |w(x)| je

TIN 062 Ondřej Čepek Víme: Pro w #P a x Σ* spočítat |w(x)| je alespoň tak těžké jako rozhodnout zda x Aw. Otázka: Existuje w #P, kde rozhodnout zda x Aw je lehké (řešitelné v polynomiálním čase x Σ*), ale spočítat |w(x)| je těžké (w je #P-úplná)? Nechť G = (U, V, E) je bipartitní graf kódovaný řetězcem x a nechť y w(x) pokud y kóduje perfektní párování v G. Potom Aw = { x | v x existuje perfektní párování } a platí: (i) Rozhodnout zda x Aw lze v polynomiálním čase ( x Σ*). (snadno lze ukázat) (ii) Spočítat |w(x)| je #P-úplná úloha. (o dost těžší, z časových důvodů bez důkazu) Definice: Permanent čtvercové matice A = (aij) velikosti n n je definován předpisem Perm(A) = σ Sn 1≤i≤n aiσ(i), kde Sn je cyklická grupa všech permutací řádu n. Pozorování: Permanent incidenční matice bipartitního grafu G = (U, V, E) (kde |U| = |V|) je přesně roven počtu perfektních párování v grafu G. Důsledek: Úloha spočítat permanent matice je #P-úplná i pro matice, které obsahují jako své prvky pouze čísla 0 a 1. 55