Přednáška NTIN061 Algoritmy a datové struktury II

Akademický rok 2016/17, zimní­ semestr

Pokračování­ přednášky NTIN060 Algoritmy a datové struktury I

Odpřednášeno:

Přednáška 4.10.2016

Knuth-Morris-Prattův algoritmus pro vyhledávání­ v textu (zatí­m bez výpočtu chybové funkce (failure function) a časové složitosti) a vyhledávání­ v textu v lineární­m čase automatem.

Dokončení­ kostry grafu jsem neměl připraveno, udělám až po vyhledávání­ v textu.

Náměty na cvičení­ viz napří­klad Martinovy texty http://mj.ucw.cz/vyuka/ads/40-kmp.pdf

A ještě s nimi prosí­m proberte lemma, které je sice ve skutečnosti triviální­, ale když ho mnozí­ studenti mají­ naformulovat a využí­t při dokazování­ správnosti KMP algoritmu a konstrukce failure function, tak ho nedají­ dohromady (jak o tom včera mluvil Jano Hric), nebo si neuvědomují­, že to je základ, na kterém vše stojí­:

prefix v_0,...,v_k vzoru V je suffixem t_0,...,t_j přečteného textu právě když zkrácený prefix v_0,...,v_{k-1} je suffixem zkráceného textu t_0,...,t_{n-1} a současně v_k=t_j.

Přednáška 1.10.2016

Dokončen KMP algoritmus a probrán algoritmus Aho-Corasickové (včetně lineární­ho odhadu výpočetní­ složitosti)

Ve cvičení­ pokračujte s vyhledávání­m v textu, např. podle Martinových pří­kladů na cvičení­.

Následují­cí­ přednášku ukáži Rabin-Karpův algoritmus pro vyhledávání­ v textu, zopakuji (dokončí­m) hledání­ minimální­ kostry (z minulého semestru) a pustí­m se do toků v sí­tí­ch.

Přednáška 18.10.2016

Probrán Rabin-Karpův algoritmus pro vyhledáváni v textu, popis a důkaz správnosti obecného schématu hledání minimální kostry grafu a započaty toky v sítích. Stručně zmíněn Ford-Fulkersonův algoritmus, ukázáno, že pro síť s 4 vrcholy a 5 hranami může počítat libovolně dlouho v závislosti na kapacitách. Započat výklad Dinitzova algoritmu.

Poznámky k přednášce a prosby k cvičícím.

1. Řada studentů na zkoušce za minulý semestr dokazovala správnost algoritmu pro min kostru pomoci t.zv. řezového lematu. Proti tomu není možno nic mít, pokud není podáno v následujícím tvaru nebo jeho mírnějších obměnách: máme-li množinu vrcholů grafu rozdělenu do dvou disjunktních množin A,B, pak minimální kostra vypadá tak, že vezmeme kostru podgrafu na A, kostru podgrafu na B a spojíme je nejlacinější hranou spojující B. Z toho správnost algoritmu pro min kostru snadno vyplyne, až na to, že to lemma v této formě je pochopitelně špatně, i když třeba podgrafy na A i B jsou souvislé. Proberte prosím na cvičení, jak vypadají (triviální) protipříklady - ta chyba se vyskytla příliš často, takže to stojí za to. Pokud text, který řezového lemmatu využívá, napsal někdo z fakulty, stálo by asi za to, ho upravit tak, aby z něj bylo jasné, že něco jako výše uvedení formulace NENÍ řezové lemma.

2. Prosím na cvičení probrat, že Ford Fulkerson s celočíselnými kapacitami zvýší tok po každé probrané cestě o 1, takže velikost toku je horní odhad počtu probraných cest, když jsou kapacity racionální, tak se dají vynásobit jejich nejmenším společným násobkem a pak viz výše, a ukázat příklad, že s iracionálními kapacitami se může nezastavit a k maximu pouze konvergovat.

3. Pro toky v sítích používám nasledující formalismus: jsou-li u,v dva vrcholy sítě, pak pokud (u,v) je hrana, jsou c(u,v) a t(u,v) rovny kapacitě hrany (u,v) a toku touto hranou, v opačném případě je c(u,v)=t(u,v) = 0. Je-li h=(u,v), pak taky píšu c(h) a t(h). Dále rezerva r(u,v) = (c(u,v)-t(u,v)) + t(v,u). A nakonec síť rezerv pro danou síť a daný tok t je orientovaný graf, mající stejné vrcholy jako ta síť a (u,v) je v něm hranou, právě když r(u,v) > 0. (Síť rezerv je závislá i na tom toku, mění se během výpočtu. Taky může být r(u,v)>0 i když (u,v) není hrana - ale pak musí být hranou (v,u)).

Převedení přebytku velikosti d z vrcholu u do vrcholu v je buď zvýšení toku t(u,v) hranou (u,v) o d, pokud ta hrana tam je a je c(u,v)-t(u,v) >= d, nebo snížení toku hranou (v,u) o d, pokud ta hrana tam je a je t(v,u)>=d, nebo kombinace obojího. V obou případech operace sníží přebytek ve vrcholu u (co do u vtéká minus co z něj vytéká) o d, přebytek v zvýší o d, rezerva r(u,v) klesne a r(v,u) stoupne o d. Proto tu operaci (kteroukoli z možností) nazývám přesunutím přebytku.

Je to na první pohled trochu zapletené, ale vyplati se to pro popis algoritmů, obzvlaště Goldbergova. FF algoritmus je pak prosté hledání orientované cesty ze zdroje do spotřebiče v síti rezerv a přenesení přebytku rovného minimu rezerv hran cesty podél této cesty. A u Goldberga se bez pojmu přebytku těžko obejdeme.

Prosím převádění přebytku trochu procvičit, hlavně aby nezapomněli, že přenesení přebytku z u do v nemusí být JEN zvýšení toku hranou (u,v).

A taky aby věděli, že pokud znám rezervy hran a předpokládám, že pro žádné u,v nejsou t(u,v) i t(v,u) současně nenulové (nedává smysl komoditu vozit tam a hned zase zpátky), pak snadno spočítám i odpovidající tok.

Přednáška 25.10.2016

Dokončen Dinitzův algoritmus včetně výpočetní složitosti O(n^2 m). Započat Goldbergův algoritmus - důkaz terminace a správnosti bude 1.11.

Přednáška 1.11.2016

Goldbergův algoritmus - dokázáno, že se zastaví po O(n^2 m) krocích a najde maximální tok (důkaz proveden jak je popsáno v textu odkazovaném dole na této stránce).

Započat výklad o DFT - na rozdíl od řady kolegů nepopisuji DFT jako nástroj pro rychlé formální násobení polynomů, ale jako metodu pro spektrální rozklad digitalizovaného periodického signálu.

Pro DFT je třeba, aby studenti rozuměli vzorečku exp(ix)=cos x + i sin x, trochu se tomu na cvičeních věnujte, třeba ukázat, jak se jednoduše dostanou vzorce pro cos 2x a sin 2x, o tom jak plyne z mocninných řad pro exponenciálu a cos a sin se zmíním na přednášce, ale dotknout se toho na cvičení by bylo užitečné.

A stálo by za to také na cvičení probrat obrazy některých funkcí pomocí přímé a inverzní DFT nebo spojité FT.

Přednáška 8.11.2016

Místo přednášky jsme děkansky dnili

Přednáška 15.11.2016

Bylo ukázáno, jak formulace DFT s exponenciálami s komplexními exponenty povstane z rozkladu funkce ve vybraných bodech pomocí goniometrických funkcí (cos, sin, konstanta).

Byl probrán algoritmus FFT, příště bude ještě ukázáno, že přímá a inverzní transformace jsou vlastně totéž a ukázány aplikace (kosinová transformace a komprese dat, násobení polynomů a čísel)

Přednáška 22.11.2016

Byla dokončena partie o diskrétní Fourierově transformaci - dokázáno, jak se počítá inverzní DFT, popsána aplikace DFT na násobení polynomů (a čísel), zmíněna kosinová transformace (pokud reálná funkce f na intervalu [0,1] je palindromická - splňuje f(x)=f(1-x) - pak z faktoru e^{2*PI*kl/n} má význam jen reálná část cos(2*PI*kl/n), ale nikoliv imaginární část sin(2*PI*kl/n), která je "anti-palindromická" a tedy ve skalárním součinu s f dá nulu; kosinová transformace obecné funkce F jako DFT "dopalindromování" F jejím prodloužením o zrcadlový obraz kolem svislé osy).

Naměty na cvičení:

Ukázat FFT v konečném tělese, podaří-li se najít vhodná n-tá odmocnina 1 a zmínit, že v tomto případě nedochází k zaokrouhlovacím chybám

Zkusit si vynásobit dva polynomy pomocí DFT

Dále byl započat výklad o bitonickém třídění - ukázána konstrukce obvodu z komparátorů, zbývá dokázat, že separační vrstva komparátoru, dostane-li na vstup bitonickou posloupnost, opravdu dělá, to co má.

Přednáška 29.11.2016

Byl dokončen výklad bitonického třídění - správnost konstrukce i počet vrstev.

Skoro celý byl vyložen popis sčítání dvou binárních čísel způsobem carry look-ahead. Zbývá jen ukázat, jak upravit obvod pro zřetězené (pipelined) počítání a ukázat, jak jednotlivé elementární uzly v obvodu vyrobit ze základních booleavských funkcí (AND, OR, NOT,...).

Příště také přidám násobení algoritmem Karacuba-Ofman a pak budu pokračovat na geometrické algoritmy (konvexní obal a Voroného diagram).

Přednáška 6.12.2016

Na Mikulášské přednášce jsme dokončili sčítání binárních čísel tím, že jsem ukázal, jak obvod upravit pro zřetězené sčítání celého proudu dvojic operandů s odstupem daným zpožděním jedné vrstvy hradel v obvodu.

Na Karacubu-Ofmana (zmiňovaného před týdnem) jsem zapomněl, zmíním ho spolu s O(n^log_2 7) algoritmem pro násobení matic později (asi příště).

Ukázal jsem algoritmus pro konvexní obal konečné množiny v rovině, kde hlavním cílem byla zajímavá a často užívaná myšlenka důkazu lineární výpočetní složitosti (jsou-li místa předem srovnána podle x-ové souřadnice). Započal jsem výklad Voroného diagramu a vyložil jsem 3D intuici, která je za Fortune-ovým algoritmem.

Náměty na cvičení:

binární operace * na množině {+,-,<}, definovaná pro carry look-ahead sčítání jako +*x=+, -*x=-, <*x=< je asociativní - dokažte s nimi a ukažte, že je-li # libovolná asociativní operace, pak a1#a2#...#an se dá paralelně počítat v čase log_2 n tak, že se napřed v jednom paralelním kroku spočítají a1#a2,a3#a4,..., v druhém paralelním kroku se součty dvojic posčítají na součty čtveřic, ... atd.

Pro Voronoi diagram proberte, že místa s neomezenými oblastmi jsou místa na obvodu konvexního obalu množiny míst. Dále prosím proberte konkrétní tvary diagramu pro jednoduché množiny míst (trojúhelník, 4 místa do obdélníka atd.)

Přednáška 13.12.2016

Byl dokončen výklad Fortunova algoritmu pro Voroného diagram včetně implementačních postupů a aplikace na hledání nejbližšího místa (site) a Delaunay triangulaci. Příště bude povídání o NP-úplnosti.

O Voronoi diagramu je možno na cvičení ještě říci dost detailnějších informací. Například, že při místní události (site event) obecně se počet oblouků pobřežní čáry (beachline) zvýší o 2 (v degenerovaném případě o 1), u kružnicové události (circle event) o 1 klesne. Z toho se dá odhadnout, kolik kružnicových událostí se během výpočtu provede, kolik oblouků kdy může mít pobřežní čára během výpočtu i po jeho ukončení atd.

Výklad o NP-úplnosti začnu konkrétními převody mezi 3SAT, 3-barevností a hledáním nezávislé množiny dané velikosti, viz .ppt prezentace na mé webové stránce v literatuře k odkazu ADS 2. Hodilo by se mi, kdybyste ukázali, jak konkrétně sestrojit booleovskou prahovou funkci n proměnních (=1 právě když alespoň k proměnných je rovno 1). Případně možno už dopředu ukázat nějaké další převody úloh, třeba z hledání množinových pokrytí na batoh nebo 2 loupežníky, to na přednášce dělat nebudu.

Syllabus

Vyhledávání­ v textu

Algoritmus Knuth-Morris-Pratt

Algoritmus Aho-Corasick

Algoritmus Rabin-Karp

Toky v sí­tí­ch

Základní­ algoritmus zlepšují­cí­ cesty - Ford-Fulkerson

Výhodný algoritmus zlepšují­cí­ cesty - Dinic

Algoritmus využí­vají­cí­ "preflow" - Goldberg

(Neprobráno: Maximální­ párování­ v bipartitní­m grafu)

Diskrétní­ Fourierova transformace

Diskrétní­ Fourierova transformace - motivace a použití­

Rychlá Fourierova Transformace (FFT)

Kosinová transformace

Tří­dí­cí­ sí­tě

Bitonická tří­dí­cí­ síť

Aritmetické algoritmy

Sčí­tání­ pomocí­ carry look-ahead

Násobení­ čí­sel - algoritmus Karatsuba-Ofman

Geometrické algoritmy v rovině

Konvexní­ obal konečné množiny

Voroného diagram

Základy teorie NP-úplnosti

Transformace mezi rozhodovací­mi problémy

Nedeterministické algoritmy, tří­dy P a NP

NP-úplnost

Aproximační­ algoritmy

Aproximační­ algoritmy - základní­ pojmy

Aproximační­ algoritmus pro problém batohu

Aproximační­ algoritmy pro bin packing

Kryptografie

Pravděpodobnostní­ testování­ prvočí­selnosti

Šifrování­ s otevřeným klí­čem - RSA šifra

Dynamické programování­

Literatura

(viz také Martin Mareš http://mj.ucw.cz/vyuka/ads/)

Aho, Hopcroft, Ullman : The design and analysis of computer algorithms, Addison-Wesley 1976

T. Cormen, Ch. Leiserson, R. Rivest, C. Stein : Introduction to Algorithms (2nd Edition), McGraw-Hill 2001

L. Kučera : Kombinatorické algorithmy, SNTL Praha 1983

L. Kučera, J. Nešetřil : Algebraické metody diskretní­ matematiky, SNTL Praha 1989

L. Kučera : Algovize

L. Kučera : Algovize - texty

NP completeness [ppt]

Goldberg - toky