From d57b76183484ea9a4f01f17decda0002968ba697 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 9 Dec 2006 00:55:30 +0100 Subject: [PATCH] Split chapter 8. --- 10-decomp/10-decomp.tex | 113 +++++++++++++++++ {8-qheapuf => 10-decomp}/Makefile | 2 +- .../8-qheapuf.tex => 8-qheap/8-qheap.tex | 114 +----------------- 8-qheap/Makefile | 3 + {8-qheapuf => 8-qheap}/trie.eps | 0 {8-qheapuf => 8-qheap}/trie.vrr | 0 all/Makefile | 2 +- 7 files changed, 119 insertions(+), 115 deletions(-) create mode 100644 10-decomp/10-decomp.tex rename {8-qheapuf => 10-decomp}/Makefile (64%) rename 8-qheapuf/8-qheapuf.tex => 8-qheap/8-qheap.tex (53%) create mode 100644 8-qheap/Makefile rename {8-qheapuf => 8-qheap}/trie.eps (100%) rename {8-qheapuf => 8-qheap}/trie.vrr (100%) diff --git a/10-decomp/10-decomp.tex b/10-decomp/10-decomp.tex new file mode 100644 index 0000000..2e5348e --- /dev/null +++ b/10-decomp/10-decomp.tex @@ -0,0 +1,113 @@ +\input ../sgr.tex + +\prednaska{10}{Dekompozice stromù}{zapsal Ale¹ ©nupárek} + +\h{Union-Find problem} +Na Uion-Find problem (UF) mù¾eme nahlí¾et ze více stran (udr¾ování ekvivalencí, +inkrementální souvislost grafu). K èemu je to dobré? +Napøíklad v Kruskalovì algoritmu pro hledání minimálních koster v grafu. +\h{Udr¾ování tøíd ekvivalence } +Mìjme nìjakou mno¾inu M, která se dá rozlo¾it na k ekvivalentních podmon¾in (tøídy ekvivalence). Na mno¾iòe M chceme provádìt +dvì operace: jsou p,q z M ekvivalentní (ve stejné tøídì ekvivalence)? (find(p,q)) Dále chceme umìt spojit dvì tøídy ekvivalence do jedné (union(p,q)). +\h{Inkrementální idr¾ování komponent souvislosti grafu} +Jedná se o pøipad podobný udr¾ování tøíd ekvivalence. Tentokrát mnou¾inou M bude mno¾ina vrcholù V grafu G (V,E). +Za »øídy ekvivalence budou jednotlivé komponenty souvislosti grafu G. Operace find nám øekne o dvou vrcholech nachází-li +se ve stejné komponen»e, èi nikoliv. Operace union nám spojí dvì komponenty do jedné pøidáním hrany. Pokud pøipustíme mazání hran, +øe©ení problému je výraznì te¾¹í. + +\h{Bì¾ná implementace } +Ka¾dé tøídì ekvivalence pøiøadíme unikátní barvu, kterou obarvíme její prvky. Pro operaci find staèí porovnat barvy prvkù. +Pro operaci union dvou komponent je nutné pøebarvit obì na stejnou barvu. Budeme pøebarvovat +v¾dy tu men¹í pak celková operace union bude trvat $\O(n\log(n) + m)$. (Ka¾dé pøebarvení minimálnì zdvojnásobí velikost nové komponenty.) +\h {Chytøej¹í implementace } +Budeme-li prvky za stejné tøídy reprezentovat ve jednom stromì (synové mají ukazatel svého otce), operaci find +provedeme prùchodem ze zadaných prvkù do koøene. Prvky jsou ve stejné komponentì souvislosti, pokud mají stejného otce. +Operace union bude spojení dvou stromù do jednoho (otec jednoho stromu se zavìsí pod listy druhého). +Takto definovaný union nemusí garantovat logaritmickou slo¾itost pro find, +v extrémním pøipadì mù¾e strom mít lineární hloubku vzhledem k poètu vrcholù. + +Degeneraci stromu lze zabránit pøidánim podmínky urèující, jaký strom bude dole. +První mmo¾nost (union by size) je povìsit dolu vìtsí strom. +Druhá mo¾nost (union by rank) je ka¾dému vrcholu nastavit na zaèátku nìjaký rank (tøeba 1). Pokud je $r1