Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

TIN062 Ondřej Čepek Složitost I TIN062 Ondřej Čepek.

Podobné prezentace


Prezentace na téma: "TIN062 Ondřej Čepek Složitost I TIN062 Ondřej Čepek."— Transkript prezentace:

1 TIN062 Ondřej Čepek Složitost I TIN062 Ondřej Čepek

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

3 TIN062 Ondřej Čepek 3 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) (promítané slajdy, příklady řešené na cvičeních, požadavky k zápočtu a zkoušce)

4 TIN062 Ondřej Čepek 4 Jak porovnávat algoritmy? časová složitost algoritmuoboje závisí na „velikosti“ prostorová složitost algoritmuvstupní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, …, a n která je třeba setřídit velikost dat D v binárním zápisu je |D| =  log 2 a 1  + … +  log 2 a n  ___________________________________________________________________ č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í, …)

5 TIN062 Ondřej Čepek 5 Příklad:f(|D|) = a |D| + blineá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, …, a n → 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č …

6 TIN062 Ondřej Čepek 6 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) n20μs40μs60μs80μs0.1ms0.5ms1ms n log n86μs0.2ms0.35ms0.5ms0.7ms4.5ms10ms n2n2 0.4ms1.6ms3.6ms6.4ms10ms0.25s1s n3n3 8ms64ms0.22s0.5s1s125s17min 2n2n 1s11.7dní36tis.let n!77tis.let

7 TIN062 Ondřej Čepek 7 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át100 krát1000 krát nx10x100x1000x n log nx7.02x53.56x431.5x n2n2 x3.16x10x31.62x n3n3 x2.15x4.64x10x 2n2n xx+3x+6x+9

8 TIN062 Ondřej Čepek 8 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) 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)

9 TIN062 Ondřej Čepek 9 Hladové Algoritmy 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ý podgraf grafu 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í d i  N + a pokuta w i  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 s i  N + jeho zahájení a čas f i  N + jeho dokončení, kde s i ≤ f i. Úkoly i a j jsou kompatibilní pokud se intervaly [s i,f i ) a [s j,f j ) 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.

10 TIN062 Ondřej Čepek 10 Matroidy Definice: Matroid je uspořádaná dvojice M=(S,I) splňující následující tři podmínky : 1. 1.S je konečná a neprázdná množina prvků matroidu M I je neprázdná množina podmnožin množiny S (nezávislých podmnožin množiny S), která má následující dědičnou vlastnost: pokud (B  I) a (A  B) tak (A  I) 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). Příklad 1: Maticový matroid (zdroj matroidové terminologie) T je reálná matice řádu nxn. Pak T definuje matroid M T =(S T,I T ) kde S T je množina sloupců matice T a A  S T je nezávislá (tj. A  I T ) 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 M G =(S G,I G ) kde S G =E a A  S G je nezávislá (tj. A  I G ) pokud A neobsahuje cyklus (tj. pokud A tvoří les). Věta: Všechny maximální nezávislé množiny v matroidu mají stejnou velikost.

11 TIN062 Ondřej Čepek 11 Definice: Matroid M=(S,I) je vážený pokud je dána váhová funkce w : S  R + a její přirozené rozšíření na podmnožiny S je dáno předpisem  A  S: w(A) =  x  A w(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 M G =(S G,I G ) a pro každé e  S G 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 M G (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 d i nebo dříve zpožděným v X pokud je ukončen až po čase d i 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 podle neklesajících lhůt dokončení (při shodě rozhoduje například číslo úkolu).

12 TIN062 Ondřej Čepek 12 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 I S množinu všech nezávislých podmnožin množ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,I S ) je matroid.

13 TIN062 Ondřej Čepek 13 Hladový algoritmus pro MP Nechť je dán matroid M=(S,I), kde S={x 1, …,x n }, 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(x i )}; 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.

14 TIN062 Ondřej Čepek 14 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

15 TIN062 Ondřej Čepek 15 Hladový algoritmus pro Problém 3 Nechť S={1,2, …,n} je množina úkolů, s 1, …,s n  N + jsou časy zahájení a f 1, …,f n  N + jsou časy dokončení (kde s i ≤ f i ). GREEDY-SELECT(s,f); A :=  ; f 0 := 0; j := 0; setřiď a přeznač pole s a f vzestupně podle časů dokončení f i {tj. f 1 =min f i }; for i := 1 to n do if (s i ≥ f j ) 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 f i. 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 ≤ s i }. Věta: GREEDY-SELECT(s,f) vrací optimální množinu pro S. Důkaz Přímý důsledek Lemma 1 a Lemma 2.

16 TIN062 Ondřej Čepek 16 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 ADS1): 1. 1.Prohledává graf po vrstvách podle vzdálenosti (měřeno počtem hran) od vrcholu s 2. 2.Běží v čase  (n+m) a funguje i na orientovaném grafu (beze změny)

17 TIN062 Ondřej Čepek 17 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) beginbarva[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 zůstane lineární (  (n+m)), ale algoritmus bude „plnit“ podstatně složitější úkol.

18 TIN062 Ondřej Čepek 18 Testování 2-souvislosti neorientovaného grafu Definice: Nechť G=(V,E) je souvislý neorientovaný graf. Pak 1. 1.Vrchol v  V je artikulace grafu G, pokud po odstranění v přestane být G souvislý Graf G je 2-souvislý pokud nemá žádné artikulace 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ů) 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 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) Algoritmy na testování 2-souvislosti: 1. 1.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. 2.Sofistikované využití DFS v čase  (n+m) =  (m) rozhodne o 2-souvislosti a zároveň označí všechny artikulace a 2-souvislé komponenty pomocí jediného spuštění „obohaceného“ DFS

19 TIN062 Ondřej Čepek 19 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á }

20 TIN062 Ondřej Čepek 20 Jak spočítat low[i] ? 1. 1.při objevení vrcholu i (přebarvení z bílý na šedý) inicializace low[i] := d[i] 2. 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) a)j = rodič[i] (tzn. že hrana (j,i) je stromová), tak se neděje nic b) 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. 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. 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. 2.vrchol i je kořenem DFS stromu a má alespoň dva potomky (což budeme testovat pomocí jednoduchého triku)

21 TIN062 Ondřej Čepek 21 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 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} beginif 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; barva[i]:=černá; end;

22 TIN062 Ondřej Čepek 22 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) beginbarva[i]:=šedá; čas:=čas+1; d[i]:=čas; for each j je soused i do if barva[j]=bílá then beginNAVŠ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;

23 TIN062 Ondřej Čepek 23 Rovinné grafy - terminologie: 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  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*.

24 TIN062 Ondřej Čepek 24 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. 1.A  B  S = V (každý vrchol je v některé části rozkladu) 2. 2.(A  B)  E =  (množina S od sebe separuje množiny A a B) 3. 3.|A|  ⅔ n 4. 4.|B|  ⅔ n 5. 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

25 TIN062 Ondřej Čepek 25 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, …,L q, kde L 0 = {s}. Dodefinujme L q+1 =  a označme |L i | = z i, i = 1,2, …,q+1. Platí (vlastnost BFS): Nechť (x,y)  E. Pak buď  i: {x,y}  L i nebo  i: x  L i a y  L i  1. Z toho plyne, že  i: L i je separátor oddělující A = L 0  …  L i-1 a B = L i+1  …  L q+1. Definice: Nechť t je index takový, že L t obsahuje n/2-tý vrchol navštívený pomocí BFS. Pozorování: Pokud platí z t  4  n tak jsme hotovi. Proto předpokládejme z t > 4  n. Lemma 3: Existují indexy v t takové, že z v   n, z w   n a (w – v)   n. Značení: C = L 0  …  L v-1, D = L v+1  …  L w-1, E = L w+1  …  L q (víme |C| 2n/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’  L v  L w A = (větší z dvojice C, E)  (menší kus D) B = (menší z dvojice C, E)  (větší kus D) Tím budeme hotovi.

26 TIN062 Ondřej Čepek 26 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 L v+1 (graf zůstane rovinný). Získaný graf označíme G’ = (V’,E’) Zkonstruujeme kostru T grafu G’ : a) a)Pro každý vrchol x  L w-1 vyber jednu hranu jdoucí z x do L w-2 a dej ji do T b) b)Opakuj předchozí krok pro vrcholy ve vrstvách L w-2, …, L v+2 c) c)Dej do T všechny hrany z s do L v+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 c e. Další postup: hledáme hranu e takovou, že cyklus c e (což je cesta v T doplňená o e) tvoří požadovaný separátor, tj. cyklus c e musí „obklíčit“ něco mezi jednou třetinou a dvěmi třetinami všech vrcholů v D.

27 TIN062 Ondřej Čepek 27 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. 1.U e = počet vrcholů grafu G’’ uvnitř cyklu c e 2. 2.D e = počet vrcholů na cyklu c e (délka cyklu c e ) 3. 3.C e = reprezentace cyklu c e 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. 1.Stěna g grafu G’’ je omezena 2 hranami stromu T a 1 příčkou 2. 2.Stěna g grafu G’’ je omezena 1 hranou stromu T a 2 příčkami a) a)Hrana stromu T je částí cyklu c e b) b)Hrana stromu T není částí cyklu c e 3. 3.Stěna g grafu G’’ je omezena 3 příčkami Lemma 5: Existuje příčka e taková, že U e  2n’/3 a n’– (U e + D e )  2n’/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’ = C e \ {s}, X = U e, Y = V’’ \ {U e  C e }, kde tentokrát chápeme U e jako množinu vrcholů. Tím jsme hotovi.

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

29 TIN062 Ondřej Čepek 29 Úlohy, optimalizační úlohy, rozhodovací problémy Ú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, …,a n a dále přirozené číslo b. Existuje S  {1, …,n} takové, že Σ i  S a i = b?

30 TIN062 Ondřej Čepek 30 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 vzhledem k |x| (tento test lze považovat za jakýsi „preprocessing“)

31 TIN062 Ondřej Čepek 31 Deterministický Turingův Stroj (DTS) 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  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 hlav (lze i zůstat na místě)

32 TIN062 Ondřej Čepek 32 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.

33 TIN062 Ondřej Čepek 33 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)} PSPACEP PSPACE =  i≥0 DSPACE(n i )P =  i≥0 DTIME(n i )

34 TIN062 Ondřej Čepek 34 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 q y ). 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.

35 TIN062 Ondřej Čepek 35 Prostorová složitost výpočtu NTS 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)} NPSPACENP NPSPACE =  i≥0 NSPACE(n i )NP =  i≥0 NTIME(n i )

36 TIN062 Ondřej Čepek 36 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ě konstruovatelná.

37 TIN062 Ondřej Čepek 37 NP-těžkost a NP-úplnost Definice: Funkce f : {0,1}*  {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’). NP NP 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. co-NP co-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 pro problém splnitelnosti booleovských formulí zadaných v KNF, my použijeme jiný rozhodovací problém.

38 TIN062 Ondřej Čepek 38 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é. NP Důkaz: 1) Kachlíkování je v NP – to je zřejmé NP 2) Kachlíkování je NP-těžké – dokážeme z definice třídy NP 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

39 TIN062 Ondřej Čepek 39 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ý podgraf grafu G? Věta: KL je NP-úplný. Důkaz: Transformace SAT  KL.

40 TIN062 Ondřej Čepek 40 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.

41 TIN062 Ondřej Čepek 41 Součet Podmnožiny (SP): Zadání: Čísla a 1, …,a n, b  Z +. Otázka: Existuje množina indexů S  {1, …,n}, taková, že Σ i  S a i = b? Věta: SP je NP-úplný. Důkaz: Transformace VP  SP. Algoritmus pro SP: předpokládejme, že platí a 1 ≥ … ≥ a n, 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[a i ] := 1; for j := b downto a i-1 do if (A[j] = 1) and (j+a i ≤ b) then A[j+a i ] := 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žin množiny {a 1, …,a i }, 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í.

42 TIN062 Ondřej Čepek 42 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)). P  NP Věta: Nechť Q je NP-úplný problém, který není číselný. Potom pokud P  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é)

43 TIN062 Ondřej Čepek 43 Silně NP- úplné problémy Nechť je Q rozhodovací problém a p polynom. Symbolem Q p označíme množinu instancí problému Q (tj. podproblém problému Q), pro které platí max(X)  p(kód(X)), tj. Q p = {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 Q p. NP Definice: Rozhodovací problém Q se nazývá silně NP-úplný, pokud Q  NP a existuje polynom p takový, že podproblém Q p je NP-úplný. P  NP Věta: Nechť Q je silně NP-úplný problém. Potom pokud P  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 3m, b  N, taková že  j : ¼ b < a j < ½ b a platí Σ j=1 3m a j = mb. Otázka:  S 1, …,S m disjunktní rozdělení množiny {1, …,3m} takové, že  i : Σ j  Si a j = b?

44 TIN062 Ondřej Čepek 44 Vztah determinismu a nedeterminismu pro 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 K p  K proveď : if TEST(K 0,K p,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). PSPACE = NPSPACE Důsledek: PSPACE = NPSPACE

45 TIN062 Ondřej Čepek 45 Aproximační algoritmy 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: Vrací (většinou) suboptimální řešení (někdy ale může vrátit i optimum) Dává odhad kvality vráceného řešení vzhledem k optimu Běží v polynomiálním čase vzhledem k velikosti zadání. Odhad kvality vráceného řešení Značení: OPT = optimální řešení APR = řešení vrácené aproximačním algoritmem f(Z) = hodnota řešení Z (předpokládáme, že je vždy nezáporná) 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í max { f(APR) / f(OPT), f(OPT) / f(APR) }  r(n). 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í |f(APR)  f(OPT)| / f(OPT)  e(n).

46 TIN062 Ondřej Čepek 46 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 kardinalitu.

47 TIN062 Ondřej Čepek 47 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) 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)??

48 TIN062 Ondřej Čepek 48 Algoritmus C: a) a) Najdi minimální kostru grafu G. b) 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) 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) ≤ Obchodní cestující bez trojúhelníkové nerovností P  NP Věta: Nechť R  1 je libovolná konstanta. Potom pokud P  NP, tak neexistuje polynomiální aproximační algoritmus řešící obecný případ obchodního cestujícího s poměrovou chybou nejvýše R. P  NP 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). 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.

49 TIN062 Ondřej Čepek 49 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, …,x n } a přirozené číslo t. Úloha: Najít množinu indexů S  {1, …,n} takovou, že sum =  i  S x i je co největší při platnosti podmínky sum ≤ t Pseudopolynomiální algoritmus pro SP Značení: Nechť L je uspořádaný seznam přirozených čísel a 1, …,a n. Pak L+x, kde x je přirozené číslo je uspořádaný seznam přirozených čísel a 1 +x, …,a n +x.

50 TIN062 Ondřej Čepek 50 SOUČET(A,t) beginL 0 := (0);{ seznam délky 1 obsahující číslo 0 } for i := 1 to n do L i := MERGE(L i-1, L i-1 + x i ); { MERGE slije oba seznamy, čísla větší než t zahodí } řešení := největší prvek v L n end. Věta: Seznam L i pro 1 ≤ i ≤ n je uspořádaný seznam obsahující součty všech podmnožin množiny A = {x 1, …,x n }, které jsou menší nebo rovny číslu t. Důkaz: indukcí podle i Časová složitost: v každém případě O(|L 1 | + … + |L n |) 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: x i ≤ p(n) pro nějaký polynom p 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’ prvek z takový, že (1 - d) y ≤ z ≤ y.

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

52 TIN062 Ondřej Čepek 52 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 množiny {x 1, …,x i }. Pak na konci i-té iterace algoritmu APPROX-SP existuje w  L i (tj. w je v prořezaném seznamu L i ) takové, že platí (1 – e/n) i y ≤ w ≤ y. Důsledek: Existuje w  L n 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 | + … + |L n |) 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 : |L i | ≤ (n  ln t) / e Důsledek: Algoritmus APPROX-SP má časovou složitost O((n 2  log t) / e) (Cíl 2 splněn).

53 TIN062 Ondřej Čepek 53 Početní úlohy 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 A w asociovaný s certifikační funkcí w je definován předpisem A w = {x  Σ* | w(x) ≠  }. Poznámka: V A w 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. #P Definice: Třída #P je množina certifikačních funkcí w takových, že 1) 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) 2)Existuje polynom p takový, že  y  w(x) : |y| ≤ p(|x|) (pro různá w různá p). #P NP Věta (o vztahu #P a NP): a)#P NP. a)Pokud w  #P tak potom A w  NP. b)NP #P. b)Pokud A  NP tak potom  w  #P : A = A w.

54 TIN062 Ondřej Čepek 54 #P NP\ co-NP 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  A w (tj. vyřešit asociovaný problém ze třídy NP) i zda x  (P(Σ*) \ A w ) (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. #P Otázka: Lze pro třídu #P zavést analogii polynomiálních transformací a úplnosti úloh ?? #P a. Definice: Nechť w : Σ*  P(Γ*) a v : Π*  P(Δ*), jsou certifikační funkce z třídy #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á. -#P#P 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. Důkaz: Mírnými úpravami transformací dokazujících NP-úplnost získáme šetrné redukce.

55 TIN062 Ondřej Čepek 55 Víme: Pro w  #P a x  Σ* spočítat |w(x)| je alespoň tak těžké jako rozhodnout zda x  A w. Otázka: Existuje w  #P, kde rozhodnout zda x  A w 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 A w = { x | v x existuje perfektní párování } a platí: (i) Rozhodnout zda x  A w 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 = (a ij ) velikosti n  n je definován předpisem Perm(A) =  σ  Sn  1≤i≤n a iσ(i), kde S n 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.


Stáhnout ppt "TIN062 Ondřej Čepek Složitost I TIN062 Ondřej Čepek."

Podobné prezentace


Reklamy Google