Tato stránka obsahuje moje poznámky z přednášky Jiřího Sgalla z akademického roku 2021/2022 (MFF UK). Pokud by byla někde chyba/nejasnost, nebo byste rádi něco přidali, tak stránku můžete upravit pull requestem (případně mi dejte vědět na mail).
Základní definice
Definice (Optimalizační problém) je I,F,f,g
I… množina všech vstupů/instancí
množina všech ohodnocených grafů
∀I∈I:F(I)… množina přípustných řešení
pro daný ohodnocený graf všechny kostry
∀I∈I,A∈F(I):f(I,A)… účelová funkce
součet hran na kostře
g… bit (zda chceme maximalizovat nebo minimalizovat)
maximalizujeme
Definice (NP-Optimalizační problém) je I,F,f,g, pro které platí stejné věci jako pro normální optimalizační problémy, ale navíc
délka přípustných řešení ≤poly(∣I∣).
jazyk dvojic (I,A),I∈I,A∈F(I) je v P (rychle umíme ověřit, zda je řešení přípustné)
f počitatelná v polynomiálním čase
Pro minimalizační zajišťujeme, že naše je vždy dostatečně malé.
Pro maximalizační zajišťujeme, že je vždy dostatečně velké.
Definice: algoritmus A je R-aproximační alg., pokud:
v polynomiálním čase v ∣I∣ na vstupu I najde A∈F(I)
pro minimalizační problém: ∀I:f(A)≤R⋅OPT(I)
pro maximalizační problém: ∀I:f(A)≥OPT(I)/R
Pravděpodobnost v algoritmech
algoritmy s chybou: někdy dělají chybu, ale většinou ji neudělají
bez chyb, běží v průměrném čase polynomiálním
třída NP: jazyky, pro které existuje polynomiální algoritmus A, který ověří správnost:
∀a∈L∃b:A(a,b)=1
∀a∈L∀b:A(a,b)=0
třída RP: jazyky, pro které existuje polynomiální algoritmus A, který ověří správnost:
∀a∈LPrb[A(a,b)]≥21
∀a∈LPrb[A(a,b)]=0
Metrický TSP
Vstup: metrika V,d na úplném ohodnoceném grafu
metrika ≡ vrcholy splňují následující:
trojúhelníková nerovnost
symetrie
d(x,y)=0⟺x=y
pokud by to nebyla metrika, tak poly algoritmus neexistuje (jde převést na normální TSP)
Výstup: cyklus C na všech vrcholech V
Cíl: minimalizovat d(C)
Kostrový algoritmus
Algoritmus (kostrový):
najdeme minimální kostru
navštívíme všechny vrcholy (například přes DFS), čímž dostaneme tah přes všechny vrcholy
zkrátíme ji na cyklus tak, že vynecháme opakující-se vrcholy
Věta:algoritmus je 2-aproximační.
Důkaz: kostra je nejvýše tak velká, jako optimální řešení a tenhle algoritmus je lepší než 2 kostry (díky trojúhelníkové nerovnosti a symetrii – procházíme i tam i zpět)
Christofidesův algoritmus
(👀): brát hrany dvakrát je plýtvání – pospojujeme liché vrcholy přes minimální párování, abychom nemuseli chodit tam a zpět
najdeme minimální kostru T
najdeme minimální perfektní párování M na vrcholech s lichými stupni v T
vždy existuje, jelikož máme úplný graf a vrcholů s lichým stupňem je sudý počet
zkrátíme na cyklus T∪M
děláme je tak, že vybereme dvě hrany incidentní s vrcholem a nahradíme je za jednu
Věta:algoritmus je 3/2-aproximační.
Důkaz:ALG≤d(T)+d(M)≤OPT+21OPT
Důkaz d(M)≤21OPT uděláme obrázkem:
Alespoň jeden z párování v cylku bude ≤21OPT, jelikož celý cyklus je lepší optimální řešení.
Poznámka:
v realitě se algoritmus chová výrazně lépe, například až k faktoru 1.1
dnes umíme (23−ε)-aproximaci
TSP v rovině: existuje (1+ε)-aproximační schéma (ale stále je NP těžký)
Quicksort
Algoritmus (quicksort):
∣S∣≤1… konec, vystoupíme S (base case)
jinak vybereme uniformě náhodně p∈S
A={x∈S∣x<p},B={x∈S∣x>p}
posloupnost má všechny prvky rozdílné, takže chceme ostrá nerovnítka
rekurzivně se zavoláme na A,B
vystoupíme A,p,B
Věta:quicksort má průměrnou časovou složitost n⋅logn.
Pro připomenutí:
E[Xi,j]=Pr[Ai,j] (indikátorová veličina)
E[X+Y]=E[X]+E[Y]
Důkaz: počítáme Ai,j – jev, že prvky pi a pj byly porovnány
Důkaz: to, že se dva prvky porovnají musí znamenat, že jeden z jich byl pivot, ale žádný mezi nimi pivot nebyl (jelikož by je to rozdělilo). Musíme tedy vybrat právě jeden z těchto dvou z intervalu [i,j], kde je celkově j−i+1 čísel.
Sečtením přes všechny dvojice i<j dostaváme následující:
To, že existuje proces, který neuspěje, odhadneme jako
Pr[i=1⋃nFi,t]≤i=1∑nPr[Fi,t]≤n⋅n−2=n−1=n1
Pravděpodobnost, že všechny procesy uspějí, je tak 1−Pr[⋃i=1nFi,t]≥1−n1
Globální minimální řez
Vstup: neorientovaný graf (V,E)
Výstup: řez F⊆E
Cíl: minimalizovat ∣F∣
Přímočarý algoritmus
Algoritmus:
převedeme graf na ohodnocený s jednotkovými cenami
zafixujeme vrchol s
pro všechny ostatní vrcholy t najdeme minimalní s−t řez
vrátíme minimum
umíme vyřešit řádové v O(n3)
Spojující algoritmus
Algoritmus:
vybereme náhodnou hranu a její vrcholy spojíme do jednoho
opakujeme, dokud nemáme pouze dva vrcholy
zbylé hrany na konci jsou náš řez
idea je to, že hran v minimálním řezu je málo a nejspíš se do nich netrefíme
pracujeme s multigrafy – při kontrakci zachováváme hrany
umíme ho implementovat rychle (řádově O(n2⋅logn))
opravdu produkuje řez, protože vrcholy mezi výslednými komponentami danými vrcholy nemizí
(👀): multigraf s n vrcholy a min. řezem velikosti k má alespoň nk/2 hran.
každý vrchol sám o sobě tvoří řez, pak stačí přes všechny posčítat…
Věta:pravděpodobnost, že najdeme daný minimální řez C je alespoň (2n)−1=n⋅(n−1)2.
Důkaz: Zafixujme některý globální minimální řez C. Nechť Ai jev, že v prvních i iteracích jsme nevybrali hranu z C.
Pr[A0]=1 (žádnou jsme ještě nevybrali)
Pr[A1]≥1−nk/2k=1−n2
Pr[A2∣A1]≥1−(n−1)k/2k=1−n−12
Po i iteracích máme n−i vrcholů a minimální globální řez má velikost alespoň k, takže máme alespoň (n−i)2k hran, z čehož nejvýše k hran je v C. Obecně tak máme:
Prostě přesouváme stroje, které končí nejpozději někam, aby začínaly dříve a zlepšujeme tím maximum.
Algoritmus (lokální prohledávání):
najdi libovolný rozvrh bez mezer (i na začátku)
vezmi libovolné j s maximálním cj
pokud existuje stroj i s délkou rozvrhu <sj, tak přesuň j na is minimální délkou
jinak vystup aktuální rozvrh
(👀):cmin neklesá
(👀): Každou úlohu přesuneme nejvýše jednou.
Důkaz: jelikož ji přesouváme na stroj s minimální délkou, tak by musel existovat nějaký s ještě menší, což by byl spor s tím, jak algoritmus funguje (dáváme na nejmenší).
Důsledek: algoritmus je polynomiální.
Věta (silnější odhad pro lokální algoritmus):algoritmus je (2−m1)-aproximační.
Largest Processing Time (LPT)
Algoritmus (LPT):
úlohy uspořádáme tak, že p1≥p2≥…≥pn
použijeme hladový algoritmus
Věta:LPT je (34−3m1)-aproximační algoritmus.
Důkaz: BUNO předpokládejme, že pn určuje délku rozvrhu (kdyby ne tak na další úlohy zapomenu a řešení se tím nezmění). Rozlišíme 2 případy:
pn≤31OPT – stejný výpočet jako předtím, jen silnější nerovnost:
ALG=T+pn, T+mpn≤OPT
stejným výpočtem jako předtím máme ALG≤OPT+(1−m1)31OPT
pn>31OPT – LPT vygeneruje optimální rozvrh
víme, že délka poslední, a tedy každé úlohy je alespoň OPT/3
žádný počítač nebude mít 3 úlohy, jelikož by pak byl větší než optimum
chceme argumentovat, že LPT udělá stejné dvojice jako optimální rozvrh:
pm+pm+1≤OPT – uvážíme-li pouze prvních m+1 úloh, tak optimální rozvrh bude mít alespoň 2 na jednom počítači a ty rozhodně nebudou kratší než dvě nejkratší
tento rozvrh s méně úlohami je jistě ≤OPT, proto nerovnost platí
pm−1+pm+2≤OPT – v optimálním rozvrhu budou mít alespoň 2 počítače dvojici úloh; v jedné z nich bude čtvrtá nejmenší (pm−1), která tam bude s nejmenší (pm+2)
obdobně dostaneme všechny další dolní odhady…
Odbočka: online algoritmy
vstup přichází postupně
řešení musíme konstruovat postupně po krocích a pak už neměníme
hladový je online, lokální prohledávání není
pro m=2: lepší než 3/2-aproximační neexistuje (úlohy délky {1,1,2})
pro m=3 je opět hladový nejlepší
pro m>3 to už tak není (existují lepší)
Bin packing
Vstup:a1,…,an≥0
Výstup: rozklad {1,…,n}=I1∪…∪Im tak, že ∀i:∑j∈Iiaj≤1
součet věcí v každém koši může být nejvýše 1
Cíl: minimalizovat m (počet košů)
Algoritmus (first fit): dej aj do prvního koše, do kterého se vejde.
Algoritmus (best fit): dej aj do nejplnějšího koše, do kterého se vejde.
Věta:oba algoritmy jsou 1.7-aproximační (a je to těsný odhad).
Věta:Je NP těžké najít R-aproximační algoritmus pro R≤3/2
Důkaz: Je NP těžké rozhodnout, zda OPT=2, jelikož pomocí něho můžeme přímočaře vyřešit problém dělení množiny na dvě časti se stejným součtem (nastavíme velikost košů na tenhle součet), což je NP těžké.
Věta:Existuje asymptotické aproximační schéma, t. j.
(∀ε)(∃ALG)(∀I)ALG(I)≤(1+ε)OPT(I)+1
Algoritmus (any fit): dej aj do nějakého neprázdného koše; pokud nelze, dej ho do nového.
zahrnuje jak best fit, tak first fit
Věta:každý any fit algoritmus má aproximační poměr ≤2.
Důkaz: Pro OPT=1 triviální. Jinak nechť Bi=∑j∈Iiaj. Musí platit, že (∀i,j,i=j)Bi+Bj>1 (jinak spor s během algoritmu). Posčítáním pro všechny dvojice dostáváme
2m<i=1∑mBi=j=1∑naj≤OPT
Hledání disjunktních cest
Vstup:
graf G=(V,E) (orientovaný/neorientovaný)
dvojice vrcholů (s,t),…,(sk,tk)
kapacita hran c
Výstup:
I⊆{1,…,k} (dvojice které spojíme cestou)
cesty Pi,i∈I,Pi cesta z si do ti tak, že každá hrana e∈E leží na nejvýše c cestách Pi
Cíl: minimalizovat ∣I∣
Jednotkové kapacity
Algoritmus (hladový):
najdeme nejkratší cestu mezi nespojenou dvojicí (přes všechna i)
pokud neexistuje, tak vystoupíme
odebereme použité hrany
(👀): hladový algoritmus nemá aproximační poměr lepší než O(m):
Délka s1↦t1 je O(k). Abychom tuto cestu nezvolili, tak musejí mít ostatní alespoň O(k) hran a celkově jich tedy musí být řádově m=O(k2). Naše řešení je tedy o k=O(m) horší.
Věta:Hladový algoritmus s c=1 je O(m)-aproximační.
Důkaz: BUNO OPT≥1 (jinak bychom hned skončili)
pak ∣I∣=ALG≥1 (také nějakou najdeme)
Nechť I∗,{Pi∗∣i∈I∗} je optimum. Počítejme cesty:
dlouhé cesty: ∣Pi∗∣>m
je jich ≤m (jinak bych měl více než m hran)
ty mi tedy nic nekazí, jelikož nám stačí, že algoritmus najde nějakou cestu
krátké cesty:
i∈I… vše ok
i∈I…Pi∗ má nějakou společnou hranu s nějakou cestou Pj t. ž. ∣Pj∣≤m
ve chvíli, kdy algoritmus poprvé vybral cestu delší než m už nemohl vybrat Pi∗, protože tu blokovala nějaká cesta, kterou již předtím zvolil (a ta musí být krátká)
Tedy počet krátkých cest Pi∗≤∑j∈I#cest blokovanyˊch Pj≤∑j∈I1+m=∣I∣⋅(1+m)
1 – náš algoritmus a optimum vybrali stejnou cestu
m – krátká cesta v našem řešení zablokuje nejvýše m ostatních krátkých
OPT=∣I∗∣≤dlouheˊm+kraˊtkeˊ∣I∣(m+1)≤O(m)∣I∣=O(m)ALG
Nejednotkové kapacity
Algoritmus (hladový pro nejednotkovou kapacitu):
zvolíme β=⌈mc+11⌉, nastavíme ∀e∈E:d(e)=1
najdeme nejkratší cestu mezi nespojenou dvojicí (přes všechna i)
pokud neexistuje nebo d(Pi)≥βc, vystoupíme
přenásobíme délku hran nejkratší cesty faktorem β a opakujeme
(👀): algoritmus nepoužije e s d(e)≥m
Důsledek: výsledné řešení je přípustné
po c použitích hrany e je d(e)=βc≈mc+1c<m, dále algoritmus hranu nepoužívá
Důsledek: algoritmus je polynomiální.
díky celočíselnosti β
Věta:Hladový algoritmus je O(β)-aproximační.
pro c=1 máme β=mc+11=m, což odpovídá
Důkaz: BUNO optimum ≥1 (jinak bychom hned skončili)
pak ∣I∣=ALG≥1 (také nějakou najdeme)
Opět si rozmyslíme to, když cesta je v našem algoritmu a když není:
i∈I… vše ok
i∈I… na konci algoritmu je d(Pi∗)≥βc (jinak by ji algoritmus použil)
Nyní nejprve zesdola odhadneme d(E) na konci algoritmu:
βc(∣OPT∣−∣I∣): dolní odhad na délku cest, které algoritmus nespojil ale optimální ano
každá cesta má na konci delku alespoň βc a je jich alespoň ∣OPT∣−∣I∣
d(E)≥βc(∣OPT∣−∣I∣)/c: každou hranu můžeme použít c-krát
Poté odhadneme d(E) zeshora (opět na konci algoritmu):
na začátku d(E)=m (délky hran jsou jednotkové)
po výběru Pi…d(Pi)≤βc⋅β=βc+1
na konci d(E)≤m+∣I∣βc+1≤(∣I∣+1)βc+1
∣I∣ je počet kroků, v každém jsme zvětšili délku vybrané cesty na βc+1
Vstup:C1∧…∧Cn, každá klauzule je disjunkcí kj≥1 literálů
každá Cj má váhu wj (=1 by default)
Výstup: ohodnocení a∈{0,1}n
Cíl: maximalizovat ∑wi (pro wj=1 je to počet splněných klauzulí)
Poznámka:
MAX-3SAT: kj≤3: NP těžké
2SAT: orientovaný graf, ve kterém různé literály implikují jiné
x1∧x2 implikuje x1⟹x2 (a obrácené)
testujeme tedy, zda graf neobsahuje cyklus (protože by pak nešel splnit)
MAX-2SAT: NP těžké
Předpokládáme:
žádný literál se v klauzuli neopakuje
nejvýše jeden z xi,xi se vyskytuje v klauzuli
RAND-SAT
Algoritmus (RAND-SAT):
vybereme nezávisle náhodně všechny literály (p=1/2)
profit?
Věta:RAND-SAT je 2-aproximační algoritmus.
Důkaz: pro každou klauzuli zavedeme indikátorovou proměnnou Yj.
pravděpodobnost, že Cj není splňená je 2kj1
Díky tomu, že kj≥1 máme E[Yj]=Pr[Cjis satistied]=1−2kj1≥21 a tedy:
E[j=1∑mwjYj]=linearita21j=1∑mwj≥21OPT
Poznámka: pro k=3 dostáváme po dosazení 78-aproximaci
∀ε>0:(78−ε)-aproximace MAX-3SATu je NP úplná
Předchozí algoritmus měl problémy s krátkými klauzulemi, jelikož je menší šance, že nějakou splní. Zkusíme to napravit tím, že jim budeme dávat preferenci.
BIASED-SAT
Algoritmus (BIASED-SAT):
vybereme nezávisle náhodně všechny hodnoty ai∈{0,1} takto:
pokud se xi vyskytuje jako jednoprvková klauzule častěji než ¬xi, pak zvol ai=1 s pravděpodobností ϕ−1=25−1, jinak ai=0
pro všechny ostatní i zvol ai=0 s pravděpodobností ϕ−1, jinak ai=1
Věta:BIASED-SAT je (ϕ−1=25−1)-aproximační algoritmus.
Z dvojice jednotkových klauzulí (xi) a (¬xi) je vždy právě jedna splněná, pro další analýzu je tak vynecháme. Zbývající jednotkové klauzule jsou splněny s pravděpodobností přesně ϕ−1. Klauzule délky k≥2 jsou splněny s pravděpodobností 1−(ϕ−1)k≥1−(ϕ−1)2=ϕ−1.
pravděpodobnost ϕ−1 jsme zvolili přesně kvůli tomu, aby platila tato poslední rovnost
Střední hodnota hodnoty výsledného řešení je tak: (pro stejné indikátorové veličiny Yi definované v důkazu pro “RAND-SAT”)
při přiřazení s pravděpodobností 1/2 použijeme RAND-SAT, jinak použijeme LP-SAT
zažijeme existenční krizi z toho, že takovýhle algoritmus funguje a je asymptoticky optimální
Věta:BEST-SAT je 43-aproximační.
Důkaz: chceme dokázat, že Pr[Cjje splneˇnaˊ]≥43zj∗.
Podívejme se, s jakou pravděpodobností splní klauzuli algoritmy:
RAND-SAT: 1−2k1 (alespoň jedna musí být splněná a volíme s p=1)
LP-SAT: [1−(1−k1)k]zj∗ (formulka z minulého důkazu těsně před odhadem)
kj
RAND-SAT
LP-SAT
BEST-SAT
1
21≥21zj∗
1⋅zj∗
2121+21zj∗≥43zj∗
2
≥43zj∗
43⋅zj∗
≥43zj∗
≥3
≥87zj∗
≥(1−e1)⋅zj∗
>43zj∗
Poznámka (derandomizace metodou podmíněných pravděpodobností): postupně plníme klauzule tak, že náhodně vybíráme pravděpodobnosti. Jelikož počet splnění určuje to, jak hodnoty vybereme, tak je můžeme vybírat (podmíněně se rozhodujeme, jak to dopadne, když xi=0 nebo xi=1 a vybereme si to lepší). Aproximační poměr si neshoršíme, jelikož vždy vybírám větší z pravděpodobností.
Pokrývací problémy
Vrcholové pokrytí
Vstup: graf G, ceny vrcholů cv≥0
Výstup:W⊆V tak, že ∀e∈E:∣e∩W∣=0
Cíl: minimalizovat c(W)=∑v∈Wcv
Algoritmus (LP relaxace):
vytvoř celočíselný lineární program:
proměnné jsou binární podle vrcholů, které vybíráme
podmínky jsou ∀(u,v)∈E:xu+xv≥1 (chceme pokrýt všechny hrany)
minimalizujeme ∑v∈Vxvcv
zrelaxuj lineární program (proměnné jsou teď reálné)
použij ho při řešení – zvol v když xv≥21
dává správné řešení, jelikož pro splnění podmínek je vždy alespoň jeden z (xu,xv)≥21
Věta:algoritmus je 2-aproximační.
Důkaz: proměnné jsme z ≥21 zaokrlouhlovali na 1, čímž jsme řešení max. zdvojnásobili.
Množinové pokrytí
Máme množiny, které mají nějaké ceny. Chceme je vybrat tak, aby jejich sjednocení obsahovalo všechny prvky a aby cena byla minimální.
Vstup: množiny S1,…,Sm⊆{1,…,n}, ceny c1,…,cm≥0
Výstup:I⊆{1,…,m} t. ž. ⋃i∈ISi={1,…,n}
Cíl: minimalizovat ∑i∈Ici
Pro rozbor budeme potřebovat ještě dva parametry:
v kolika nejvíce množinách je nějaký prvekf=maxe=1n∣{j∣e∈Sj}∣
velikost největší množinyg=maxj=1m∣Sj∣≤n
(👀): vrcholové pokrytí je množinové pokrytí s f≤2
Program pro vrcholové pokrytí:
proměnné jsou binární podle vrcholů, které vybíráme
podmínky jsou ∀(u,v)∈E:xu+xv≥1 (chceme pokrýt všechny hrany)
minimalizujeme ∑v∈Vxvcv
f-aproximační algoritmy
Algoritmus (LP relaxace):
vytvoř celočíselný lineární program:
proměnné jsou x1,…,xm≥0 podle množin
podmínky jsou ∀e∈{1,…,n}:∑j∣e∈Sixj≥1 (chceme pokrýt všechny prvky univerza)
minimalizujeme ∑i∈{1,…,m}xici
zrelaxuj lineární program (proměnné jsou teď reálné)
použij ho při řešení – zvol v když xv≥f1
dává správné řešení – argument je stejný jako u vrcholového pokrytí
Věta:algoritmus je f-aproximační.
Důkaz: proměnné opět zvětšuji z f1 na 1, řešení tedy zhorším nejvýše f-krát.
Význam primáru (sběratel): jak můžu nejlevněji nakoupit balíčky známek tak, abych měl všechny známky.
Význam duálu (procejce): kolik můžu nejvíce účtovat za každou známku, aby byl obchod ochotný kupovat známky a tvořit z nich balíčky.
(👀): duál programu vypadá následně:
proměnné jsou y1,…,yn≥0 pro každý prvek
podmínky jsou ∀j∈{1,…,m}:∑e∈Sjye≤cj
maximalizujeme ∑e∈Sjye
(👀): podmínky komplementarity:
∀j:xj∗=0∨∑ye∗=cj
pokud by prodejce na obálce vydělal, tak ji sběratel nekoupí
pokud prodejce na známce nevydělává, tak ji sběratel koupí
∀e:ye∗=0∨∑j∣e∈Sjxj∗=1
pokud prodejce prodává známku zdarma, tak jí sběratel nakoupí trochu více
pokud prodejce známku zdarma neprodává, tak jí sběratel nekoupí víc než potřeba
Algoritmus (primárně-duální algoritmus):
y1,…,yn=0;I=∅,E=∅
dokud existuje nepokryté e∈E, tak zvyšíme ye „co nejvíce“:
δ=minj∣e∈Sj(cj−∑e∈Sjye)
zvyšujeme tak, abychom splnili tu nejpřísnější duální podmínku
ye=ye+δ
∀j:e∈Sj a ∑e∈Sjye=cj přidám j do pokrytí (I=I∪{j}) a E=E∪Sj
do algoritmu přidáme ty množiny, jejichž podmínky komplementarity jsme naplnili
(👀): po přidání do algoritmu se ye prvku nezmění (ostře splníme nějakou rovnost)
Jelikož q je přípustné řešení duálu, pak ze slabé duality platí:
OPT≥e∈E∑qe=Hg1⋅e∈E∑qe=Hg1ALG
Maximální nezávislá množina
Vstup: graf G=(V,E)
Výstup:I⊆V nezávislá množina, maximální vzhledem k inkluzi
největší moc dobře řešit nejde (ani aproximovat)
Nás zajímá najít rychlý paralelní algoritmus:
operací chceme udělat řádově O(logn)
k dispozici máme řádově m procesorů (každý vrchol/hrana má jeden)
povolujeme procesorům najednou šahat na data a najednou měnit data na stejnou věc
Algoritmus (rychlý paralelní):
I=∅
dokud V=∅, tak každý následující krok děláme paralelně:
∀v∈E pokud je stupeň 0, pak přidáme do I a vymažeme z V
∀v∈E označ v (přidej do S) s pravděpodobností 2dv1 (nezávisle)
∀u,v∈E pokud u i v jsou označené, odeber značku u vrcholu nižšího stupně
nižší stupeň proto, abychom odebírali hran co nejvíce
přidej označené vrcholy do I a odeber je a jejich sousedy (a odpovídající hrany) z V
sousedy množiny S značíme N(S)
Chceme, aby se graf v každé iteraci zmenšil o nějakou část a iterací bylo tedy logaritmicky. Uděláme to počítání toho, že máme hodně dobrých hran a že jich hodně zmizí.
Definice: vrchol je dobrý, jestliže má ≥3dv sousedů stupně ≤dv
má velkou pravděpodobnost, že ho vyřešíme výběrem souseda, protože má hodně sousedů malého stupně
analogicky špatný vrchol a dobrá (obsahuje dobrý vrchol) a špatná hrana
Lemma:alespoň polovina hran je dobrá.
Důkaz: hrany zorientujeme od menšího k většímu stupni (rovnost řešíme libovolně)
v špatný ⟹dvin<3dv
z definice – vstupující jsou stejného nebo menšího stupně, takže jich má málo, jinak by byl dobrý
>32dv vstupuje a platí dvin≤21dvout
„za každou špatnou hranu nejvýše dvě dobré“
Nyní počítáme
∣sˇpatneˊ hrany∣≤vsˇpatnyˊ∑dvin≤vsˇpatnyˊ∑21dvout≤v∈E∑21dvout≤21∣E∣//sˇpatnaˊ hrana jde do sˇpatneˊho vrcholu//nerovnost vyˊsˇe
Tedy dobrých je ≥21∣E∣.
Pravděpodobnost, že dobrý vrchol odstraním (buď označením toho vrcholu samotného nebo nějakého jeho souseda) je α>0.
Lemma:existuje α>0 t. ž. ∀vdobrý platí
Pr[v∈S∪N(S)]≥α
pravděpodobnost, že v je označený nebo je označený některý jeho soused
přímo z toho plyne to, co chceme, jelikož dobré hrany jsou pouze u dobrých vrcholů
Důkaz: Pro dobrý vrchol v platí následující:
Pr[vmaˊ souseda oznacˇeneˊho v kroku 2]≥1−w∈N(v)∏(1−2dw1)neoznacˇıˊme zˇaˊdneˊho souseda≥1−(1−2dv1)3dv//lemma vyˊsˇe≥1−e−61=konstanta
Může být špatné, když by se hodně ze sousedů dobrého vrcholu odstranilo. To dokážeme, že se nestane tím, že ukážeme, že u libovolného vrcholu v odstraníme značku s ≤ konstantní pravděpodobností (jen pozor, v Pr používáme podmíněně, že v byl označený):
Pr[odstranıˊme znacˇku]=Pr[je oznacˇenyˊ soused s veˇtsˇıˊm stupneˇm]=Pr[∃u∈N(v):du≥dw∧ubyl oznacˇenyˊ]≤u∈N(v)∣du≥dv∑Pr[ubyl oznacˇenyˊ]=u∈N(v)∣du≥dv∑2du1≤u∈N(v)∣du≥dv∑2dv1≤dv⋅2dv1≤21
Nikde v důkazu nepočítáme s pravděpodobností označení dobrého vrcholu, což nepotřebujeme.
Spojením odhadů dostaneme, že pro dobrý vrchol v je Pr[v∈S∪N(S)]≥α pro α=(1−e−61)/2.
Věta:očekávaný počet fází algoritmu je ≤O(logn)
Důkaz: nechť Mi= počet hran po i fázích. Pak platí
E[Mk]≤(1−2α)k⋅E[M0]=(1−2α)k⋅m
Pokud E[Mk]≤21, pak z Markovovy nerovnosti Pr[Mk≥1]≤21, takže Pr[Mk=0]≥21.
2-Univerzalita: pro dva rozdílné prvky máme pro náhodnou hashovací funkci z rodiny omezenou pravděpodobnost, že se namatchují na stejnou hodnotu.
Silná 2-univerzalita: zahashované hodnoty x1,x2 tvoří dvě náhodné po dvou nezávislé veličiny. Takže kromě toho, že jsou univerzální (když zafixuju jeden, tak se tím druhým trefím s pravděpodobností n1 to platí i pro libovolnou dvojici, na kterou prvky mapuju.
chceme, aby operace vyhledání běžela v maximálním čase O(1)
to jsme předtím neměli – seznam mohl být dlouhý a maximální počet operací velký
použijeme tabulky dvě:
hashujeme dvakrát – jednou pro index do první tabulky, ta určí funkci pro druhé hashování
v první budeme chtít ≤n kolizí, ve druhé =0
v první tabulce máme přihrádky velikosti ni, pro každou z nich pak vytvoříme další tabulku velikosti ni2
vybereme h∈H tak, že má ≤n kolizí
kolize C={{x,y}∣x,y∈M,x=y,h(x)=h(y)}
Lemma:existuje h∈H s počtem kolizí ≤n.
Důkaz:E[∣C∣]≤2−univ(2s)n1≤s≤n(2n)⋅n1≤2n
- pokud vybereme uniformně náhodně hashovací funkci z \(h \in H\), pak dle Markovovy nerovnosti \(\mathrm{Pr}[|C| \ge n] \le \frac {\mathbb{E}[|C|]} n \le \frac 1 2\)
- každá druhá taková funkce má \(\le n\) kolizí
Lemma:existuje hi∈H s počtem kolizí 0.
Důkaz:E[∣Cni∣]≤(2ni)⋅ni21≤21
- opět dle Markovova pro uniformně náhodně vybranou \(h\in H\) máme \(\mathrm{Pr}[|C_{n_i}| \ge 1] \le \mathbb{E}[|C_{n_i}|] \le \frac 1 2\)
- každá druhá taková funkce má 0 kolizí
(👀):∣C∣=∑i=1n(2ni)=∑2ni2−∑2ni
počet prvků kolidující do daného políčka je ni, počet dvojic je tedy výraz nahoře
Výpočtem dostáváme ∑ni2≤2∣C∣+∑ni≤2n+s=O(s)
Testování
Násobení matic
pomalé násobení: O(n3)
nejlepší známé: O(nω)
ω=2.37
Vstup:A,B,C⊆Kn×n (pro těleso K)
Výstup: ANO, pokud A⋅B=C, jinak NE
Lemma:nechť a∈Kn,a=0 a x∈{0,1}n uniformně náhodný. Pak
Prx[aT⋅x=0]≥21
Důkaz: uvažme poslední nenulovou souřadnici ak. Ta má hodnotu 0 nebo ak, podle vybraného bitu. 0 bude tedy právě tehdy, když součet předchozích vyšel ak (a opakujeme s k−1,…).
Věta:existuje pravděpodobnostní algoritmus s jednostrannou chybou pro testování maticového násobení v čase O(n2)
když platí, tak vždy řekne že platí
když neplatí, tak udělá chybu s nějakou pravděpodobností (konkrétně ≤21)
Algoritmus:
vezmi náhodný x∈{0,1}n
vystup ANO, jestliže A⋅(B⋅x)=C⋅x, jinak NE
nejdříve vynásobíme x maticí B, až pak maticí A, abychom měli kvadratickou časovou složitost
(👀): algoritmus trvá O(n2) kroků
(👀): algoritmus řekne ano ⟺(A⋅B−C)⋅x=D⋅x=0
pokud D=0, pak algoritmus správně odpoví ANO
pokud D=0, pak algoritmus udělá chybu s pravděpodobností ≤21
D je nenulová matice, má tedy nenulový řádek
podle lemmatu platí Prx[D⋅x=0]≥21
Nulovost polynomů (Polynomial Identity Testing)
nezajímá nás, jestli je identicky nulový, ale zda je nulový v tělese, ve kterém pracujeme
uvažujeme více proměnných
d… celkový stupeň (t. j. součet stupňů v nějakém nenulovém monomu)
převeditelné na to, zda je výrok tautologie (jdou na sebe převést) ⟹ NP těžké
Budeme používat trochu divný vstup:
Vstup: matice polynomů proměnných, determinant určuje náš polynom
Výstup: ANO, jestliže je polynom identicky nulový, jinak NE
Lemma:nechť P(x1,…,xn) je nenulový polynom nad K stupně ≤di a S⊆K konečná. Nechť x1,…,xn∈S unif. náhodně. Pak pravděpodobnost, že jsme se trefili do jednoho z kořenů z S, je
Prx[P(x)=0]≤∣S∣d
n=1… polynom má nejvýše d kořenů, ať zvolíme s jakkoliv
je to dost šikovné, protože podle ∣S∣ si volíme přesnost algoritmu (pro ∣S∣≥2d máme ≥21)
Důkaz: pro n=1 platí. Nyní indukcí podle n. Rozdělíme polynom na A a B, kde stupeň v B je ostře menší k. To umíme tím, že vytkneme nějakou proměnnou:
P(x)=x1k⋅A(x2,…,xn)+B(x)
A je identicky nulový (podle IP) s pravděpodobností ≤∣S∣d−k
chci dokázat, že Pr[P(x)=0∣A(x2,…,xn)=0]≤∣S∣k
při konkrétních hodnotách x2,…,xn se mi polynom vyhodnotí na nějaké číslo a zbytek polynomu P(x) bude αx1k+β, což nebude mít více než k kořenů