STROMY A KOSTRY Doc. RNDr. Josef Kolář, CSc

Slides:



Advertisements
Podobné prezentace
Grafové algoritmy.
Advertisements

Komplexní čísla. Komplexní číslo je uspořádaná dvojice [x, y], kde číslo x představuje reálnou část a číslo y imaginární část. Pokud je reálná část nulová,
NEJKRATŠÍ CESTY MEZI VŠEMI UZLY
PLANARITA A TOKY V SÍTÍCH
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
Red-Black Stromy Binární Vyhledávací Stromy, u kterých je časová složitost operací v nejhorším případě rovná O(log n)
Aplikace teorie grafů Základní pojmy teorie grafů
ALGO – Algoritmizace 1. cvičení
Algebra.
ADT Strom.
Medians and Order Statistics Nechť A je množina obsahující n různých prvků: Definice: Statistika i-tého řádu je i-tý nejmenší prvek, tj., minimum = statistika.
FORMALIZACE PROJEKTU DO SÍŤOVÉHO GRAFU
Binární stromy, AVL stromy
LOGISTICKÉ SYSTÉMY 7/14.
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
TI 6.1 STROMY A KOSTRY Stromy a kostry. TI 6.2 Stromy a kostry Seznámíme se s následujícími pojmy: kostra grafu, cyklomatické číslo grafu, hodnost grafu.
REDUKCE DAT Díváme-li se na soubory jako na text, pak je tento text redundantní. Redundance vyplývá z:  některé fráze nebo slova se opakují  existuje.
Fakulta životního prostředí Katedra informatiky a geoinformatiky
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
ORIENTOVANÉ GRAFY V této části se seznámíme s následujícími pojmy:
Stromy.
Matice.
Univerzita Karlova Matematicko-fyzikální fakulta Lukáš Jirovský Teorie grafů – prezentace Bc. Práce Vedoucí práce: RNDr. Pavla Pavlíková, Ph.D.
CW – 05 TEORIE ROZHODOVACÍCH PROCESŮ
STROMY Datová struktura sestávající z uzlů
VLASTNOSTI GRAFŮ Vlastnosti grafů - kap. 3.
Matematické metody optimalizace Tomáš Vaníček Katedra inženýrské informatiky Stavební fakulta ČVUT Thákurova 7, Praha 6 Dejvice, b407
Kostra grafu Prohledávání grafu
Rozpoznávání v řetězcích
Množiny.
hledání zlepšující cesty
Vektorové prostory.
Barvení grafů Platónská tělesa
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)Prohledávání stavového prostoruGRA, LS 2013/14, Lekce 11.
Sylabus V rámci PNV budeme řešit konkrétní úlohy a to z následujících oblastí: Nelineární úlohy Řešení nelineárních rovnic Numerická integrace Lineární.
Vstup: Úplný graf G=(V,E), ohodnocení hran d:E → R + Výstup: Nejkratší Hamiltonovská cesta HC v grafu G Najdi minimální kostru K grafu G Pokud K neobsahuje.
Planarita a toky v sítích
Les, stromy a kostry Kružnice: sled, který začíná a končí ve stejném vrcholu, ostatní vrcholy jsou různé Souvislý graf: mezi každými dvěma vrcholy existuje.
Radim Farana Podklady pro výuku
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)Turingovy strojeGRA, LS 2012/13, Lekce 12 1 / 21 TURINGOVY.
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)NP-úplné problémyGRA, LS 2012/13, Lekce 13 1 / 14 NP-ÚPLNÉ.
VLASTNOSTI GRAFŮ Doc. RNDr. Josef Kolář, CSc
Stromy a kostry. Definice stromu Souvislý (neorientovaný) graf – mezi každými dvěma vrcholy existuje (alespoň jedna) cesta Strom je souvislý graf, který.
Jak je to s izomorfismem
GRAFOVÉ ALGORITMY A ZÁKLADY TEORIE SLOŽITOSTI Doc. RNDr
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)Toky v sítích IIGRA, LS 2013/14, Lekce 10 1 / 35 TOKY V.
Hledání cyklů Komunikační sítě Elektrické obvody Odběr surovin a výrobků v průmyslové výrobě Logistika Chemie ….
TI 3.1 UPOZORNĚNÍ Reprezentace grafů, odst. 4.1 dne (za týden) bude X36TIN dvakrát dne (za 5 týdnů) bude X36OSY dvakrát skripta.
NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6.
Úvod do databázových systémů
Funkce Funkce je zobrazení z jedné číselné množiny do druhé, nejčastěji Buď A a B množiny, f zobrazení. Potom definiční obor a obor hodnot nazveme množiny:
Množina bodů dané vlastnosti
STROMY A KOSTRY Stromy a kostry - odst. 3.2.
Znázornění dopravní sítě grafem a kostra grafu Předmět: Teorie dopravy - cvičení Ing. František Lachnit, Ph.D.
Překladače 5. Syntaktická analýza
MATEMATIKA Obsah přednášky. Opakování, motivační příklady Funkce.
MINIMÁLNÍ KOSTRA V GRAFU
Běžné reprezentace grafu
PLANARITA A TOKY V SÍTÍCH
Množina bodů dané vlastnosti
Výpočetní složitost algoritmů
ORIENTOVANÉ GRAFY V této části se seznámíme s následujícími pojmy:
Toky v sítích.
Fronta (1) Dynamická datová struktura typu FIFO (First In First Out)
MNOŽINY RNDr. Jiří Kocourek.
NEJKRATŠÍ CESTY MEZI VŠEMI UZLY
Algoritmizace Dynamické programování
Množina bodů dané vlastnosti
VLASTNOSTI GRAFŮ Vlastnosti grafů - kap. 3.
AVL a B-stromy cvičení Radek Mařík.
Transkript prezentace:

STROMY A KOSTRY Doc. RNDr. Josef Kolář, CSc STROMY A KOSTRY Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2013/2014, Lekce 6 https://edux.fit.cvut.cz/courses/BI-GRA Doc. Josef Kolář (ČVUT) Stromy a kostry

Stromy a kostry Seznámíme se (připomeneme si) následujícími pojmy: kostra grafu, cyklomatické číslo grafu, hodnost grafu kořenový strom, hloubka stromu kořenová kostra orientovaného grafu uspořádaný strom, pravidelný strom stupně r, úplný pravidelný strom vnější/vnitřní délka stromu, binární strom průchody preorder/inorder/postorder Skripta odst. 3.2, str. 49 – 58

Stromy a kostry Připomeňme si nejprve, co je to strom ... a co je to kostra grafu ... Co lze říci o stromech? Nechť G = H,U je prostý graf. Potom G je strom u,vU existuje právě jedna cesta u  v G je souvislý, ale G - {h} není pro libovolnou hH G je souvislý a platí |H| = |U| - 1 G neobsahuje kružnice a platí |H| = |U| - 1 G neobsahuje kružnice, ale G  {h} ano jsou ekvivalentní tvrzení

Větve a tětivy Fundamentální soustava kružnic odpovídající dané kostře Kostra grafu rozdělí hrany na větve a tětivy Fundamentální soustava kružnic odpovídající dané kostře Cyklomatické číslo (počet nezávislých kružnic = počet tětiv) (G) = |H|-|U|+p (p je počet komponent) Hodnost grafu (počet hran kostry nebo lesa grafu) h(G) = |U|-p

Orientované stromy (připomenutí) kořenový strom Kořenový strom Tu (s kořenem u) - orientovaný strom, kde každá cesta vycházející z kořene C(u,v) je orientovanou cestou.

Kořenová kostra OG orient. graf jeho kostra kořenová kostra Kořenová kostra - kostra, která je kořenovým stromem. Hloubka hl(x) uzlu x v kořenovém stromu = vzdálenost od kořene Hloubka kořenového stromu = max hl(x) xU

toto jsou různé uspořádané stromy orientace hran orientace hran uspořádání následníků toto jsou různé uspořádané stromy Uspořádaný (kořenový) strom – následníci (podstromy každého uzlu) jsou pevným způsobem uspořádáni (první, druhý, ...)

Úplný pravidelný strom Pravidelné stromy stupeň 3 hloubka 2 stupeň 3 hloubka 4 Úplný pravidelný strom stupně r hloubky k - všechny listy jsou v hloubce k od kořene Pravidelný strom stupně r (1) (+(u) = 0 nebo r)

Pravidelné stromy Statistika: 7 listů (m)  6 vnitřních uzlů (k) 12 hran (h) Zjištění: Pro každé kN existuje pravidelný strom stupně 2 s k vnitřními uzly (má k+1 listů a 2k hran: k / k+1 / 2k ) ?Jak je to pro obecný stupeň r (2) ? k / k.(r-1)+1 / k.r k=7, r=3 7/15/21 k=4, r=3 4/9/12

E = I . (r-1) + r . k, kde k je počet vnitřních uzlů Pravidelné stromy 0 . . . . . . . . . . . . . . 1 . . . . . . . 2 . . . . 3 . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . Statistika (r=2): E(T)=2.4+3.3+2.2= 21 I(T)=1.3+2.2+2.1=9 Statistika (r=3): E(T)=3.4+5.3+4.2+1.1= 36 I(T)=1.3+2.2+2.1=9 vnější délka E(Tu) =  hl(v) sčítá se přes listy v vnitřní délka I(Tu) =  hl(v) sčítá se přes vnitřní uzly v E = I . (r-1) + r . k, kde k je počet vnitřních uzlů r=2: 21=9.1+2.6 r=3: 36=9.2+3.6

Pravidelné vs. n-ární stromy pravidelný strom stupně 2 binární strom Binární strom Průchody binárním stromem - žádný uzel (prázdný) - preorder: kořen, LS, PS - kořen, levý podstrom, pravý podstrom - inorder: LS, kořen, PS - postorder: LS, PS, kořen

Kontrolní otázky 6.1 Určete, jakou podmínku musí splňovat uzel u souvislého orientovaného grafu, aby existovala kořenová kostra tohoto grafu s kořenem u. 6.2 Pro obecný počet uzlů n (n  3) určete, jak vypadá strom s n uzly, který má maximální (resp. minimální) počet listů. 6.3 Kolik různých kružnic vznikne, přidáme-li do kostry grafu dvě tětivy? 6.4 Zdůvodněte, proč se při libovolném z průchodů preorder, inorder, postorder binárního stromu navštíví jeho listy ve stejném relativním pořadí. 6.5 Předpokládejme, že uzly pravidelného stromu stupně 2 jsou nějak očíslovány pořadovými čísly 1 až n. Ukažte, že strukturu tohoto pravidelného stromu lze jednoznačně rekonstruovat, pokud jsou k dispozici alespoň dvě z posloupností získaných průchodem preorder, inorder a postorder tohoto stromu. 6.6 Neorientovaný strom T má k listů a součet stupňů jeho vnitřních uzlů je s. Určete, co z toho bezprostředně plyne pro vlastnosti čísel k a s počet vnitřních uzlů stromu T v závislosti na k a s. 6.7 Šířkou kořenového stromu se nazývá maximum počtu uzlů nacházejících se ve stejné hloubce. Navrhněte algoritmus pro určení šířky zadaného kořenového stromu.

Minimální kostry Seznámíme se s následujícími pojmy: generování všech koster grafu množinový rozklad minimální kostra grafu Borůvkův-Kruskalův algoritmus Jarníkův-Primův algoritmus hladové algoritmy, Huffmanovo kódování Skripta kap. 5, str. 91 - 109

Generování koster grafu ?Jak bychom generovali všechny kostry grafu? Pomocí stromu všech koster - efektivní test vzniku kružnic! b e e d b a  c 4 hrany bez kružnic a g e d c b f d g f e e d c f e d f e d g f e g f e g f g g f g f e g f g g f g f e g f f g f g g f g g

Přidáváme hrany a testujeme vznik kružnice. Generování koster grafu Rekapitulace: Přidáváme hrany a testujeme vznik kružnice. K tomu se hodí ... Množinový rozklad - dynamický soubor podmnožin dané množiny s následujícími operacemi: - MAKE-SET(x) vytvoří jednoprvkovou podmnožinu - UNION(x,y) sjednocení podmnožin s prvky x a y - FIND(x) určí reprezentanta podmnožiny s prvkem x

? Složitost : (|U| + |H|) ? Výhoda : dynamika! Množinový rozklad Další použití: void KOMP(Graph G) { // určení komponent NG for (Node u in U(G)) MAKE-SET(u); for (Edge (u,v) in H) if (FIND(u) != FIND(v)) UNION(u,v); } a b (a,d) {a,b,d,c} {e,f,g} {h,i} (b,c) {a,b,d,c} {e,f,g} {h,i} (a,b) {a,b} {c} {d} {e} {f} {g} {h} {i} {a} {b} {c} {d} {e} {f} {g} {h} {i} (a,c) {a,b,d,c} {e,f} {g} {h,i} (d,b) {a,b,d} {c} {e,f} {g} {h} {i} (e,f) {a,b} {c} {d} {e,f} {g} {h} {i} c d (h,i) {a,b,d} {c} {e,f} {g} {h,i} e f (e,g) {a,b,d,c} {e,f,g} {h,i} (f,g) {a,b,d,c} {e,f,g} {h,i} g h i ? Složitost : (|U| + |H|) ? Výhoda : dynamika!

Množinový rozklad ? Dokážeme to ještě lépe ? ANO ! Jak implementujeme množinový rozklad ? Pomocí seznamů s odkazy na reprezentanta: MAKE-SET, FIND ... O(1) UNION ... O(min(m,n)) (pro vyvažování) (vyžaduje uchovávat další pomocné údaje) Agregovaná složitost m operací, z toho n x MAKE-SET: O(m + n.lg n) Při použití na určení kostry provedeme: |U|-krát MAKE-SET max. 2.|H|-krát FIND (|U|-1)-krát UNION  n = |U|, m  2.(|U|+|H|)  O(2|H| + 2|U| + |U|.lg |U|) = O(|H| + |U|.lg |U|) ? Dokážeme to ještě lépe ? ANO !

Množinový rozklad Další heuristiky pro množinový rozklad zkracování cesty při FIND UNION podle hodností Datové struktury: p[x] - předchůdce uzlu x hod[x] - hodnost (aproximace výšky)

O(m . lg* n) neboli O((|U|+|H|) . lg* |U|) Množinový rozklad void MAKE-SET (int x) { p[x] = x; hod[x] = 0; } void UNION (int x, int y) { LINK(FIND(x), FIND(y)); } void LINK(int x,int y) { if (hod[x] > hod[y]) p[y] = x; else { p[x] = y; if (hod[x] == hod[y]) hod[y]++; } } void FIND(int x) { if (x != p[x]) p[x] = FIND(p[x]); return p[x]; } Složitost m operací MAKE-SET, FIND, UNION, když počet MAKE-SET je přesně n: O(m . lg* n) neboli O((|U|+|H|) . lg* |U|)

w(h) (součet přes hHv) je minimální Minimální kostra (neorientovaného) grafu ? Jaká kostra je minimální ? Každá má přece |U|-1 hran! G = H,U je souvislý NG s nezáporným ohodnocením hran w: H  R+. Hledáme kostru T = Hv,U takovou, že w(h) (součet přes hHv) je minimální ? K čemu to bude dobré ? 2 1 3 6 6 8 8 10 8 Kolik má koster ? 32

Minimální kostry ? Jak poznáme, že kostra je minimální ? prohledáme všechny kostry grafu ??? uhádneme kostru a ověříme její minimálnost (JAK?) V: Kostra T grafu G je minimální  pro každou tětivu t je w(t)  max w(h) pro hK (kde K je jediná kružnice v T{t}) 2 2 2 2 2 2 3 3 3 3 1 3 1 3 1 2 2 2 2 2 2 1 1 1

Hledání minimální kostry ? Praktické možnosti ? odebírat hrany z původního grafu ??? najít libovolnou kostru a postupně ji upravovat ??? vytvářet minimální kostru přidáváním vhodných hran !!! Generický algoritmus pro minimální kostru void GENERIC-MST(Graph G,Weights w) { T = ; while ("T netvoří kostru") { "najdi vhodnou hranu [u,v] pro T" T = T  [u,v] } return T; TOHLE je ten problém

Hledání minimální kostry Jak hledat hranu pro přidání do minimální kostry? V: Nechť P je podstrom vytvořené části minimální kostry grafu G, [p,q] je hrana taková, že - pP, qP - w([p,q]) = min w([u,v]) pro vš. hrany [u,v], uP, vP . Pak lze hranu [p,q] přidat k minimální kostře. kandidáti na přidání do kostry P G-P

Borůvkův - Kruskalův algoritmus void BK-MST(Graph G, Weights w) { 1 T = ; 2 for (Node u in U(G)) MAKE-SET(u); 3 "seřaď H(G) podle neklesajících vah w(h)" 4 for (Edge [u,v] in H(G)) { // v daném pořadí 5 if (FIND(u) != FIND(v)) { T = T  [u,v]; UNION(u,v); 8 } } return T; } O(|H|.lg |H|) řazení O(|H|. lg* |U|) dynamický rozklad

Použítí Borůvkova-Kruskalova algoritmu 1 2 3 5 6 4 1 2 2 3 1 2 2 1 1 2 2 3 1 2 1 3 2 1 2 1 3 H O T O V O !

O(|U|) + O(|U| . lg |U|) + O(|H| . lg |U|) Jarníkův - Primův algoritmus void JP-MST(Graph G, Weights w, Node r) { 1 Q = U; // T:=; 2 for (Node u in Q) d[u] = ; 3 d[r] = 0; p[r] = null; 4 while ( Q !=  ) { 5 u = Q.ExtMin(); // T:=T{(p[u],u)} 6 for (Node v in Adj[u]) { 7 if ((vQ) && (w(u,v) < d[v])) { 8 p[v] = u; d[v] = w(u,v); 9 } } } } POZOR! Nemají konstantní složitost !!! O(|U|) + O(|U| . lg |U|) + O(|H| . lg |U|)

Použítí Jarníkova-Primova algoritmu 1 2 3 5 6 4 1 2 2 4 1 2 2 3 1 1 2 2 1 3 2 1 3 2 1 2 1 3 H O T O V O !

Srovnání výsledků 1 2 3 1 2 3

Kontrolní otázky 6.8 Nechť G je souvislý neorientovaný graf s nezáporným ohodnocením hran w, nechť H1 je nějaká podmnožina jeho hran, která neobsahuje kružnice. Navrhněte algoritmus nalezení kostry s minimálním ohodnocením hran takové, že obsahuje všechny hrany z množiny H1. 6.9 Zjistěte, zda jsou následující tvrzení pravdivá či nikoliv. Pravdivá tvrzení dokažte, nepravdivá vyvraťte co nejjednodušším protipříkladem: Jsou-li ohodnocení všech hran v souvislém neorientovaném grafu navzájem různá, je jeho minimální kostra určena jednoznačně. Jsou-li ohodnocení všech hran v souvislém neorientovaném grafu navzájem různá, pak mají každé dvě jeho různé kostry různá ohodnocení. Nechť je ohodnocení hrany h v souvislém neorientovaném grafu menší než ohodnocení každé jiné hrany. Pak je hrana h obsažena v každé jeho minimální kostře. 6.10 Graf G vzniknul tak, že jsme do stromu přidali hranu spojující nějakou dvojici jeho nesousedních uzlů. Čím je určen počet různých koster takto vytvořeného grafu G? 6.11 Ukažte na příkladu, že popsanými algoritmy hledání minimální kostry neorientovaného grafu nelze obecně získat minimální kořenovou kostru orientovaného grafu. V čem spočívá hlavní obtíž?

Kontrolní otázky 6.12 Kolik různých koster má níže uvedený graf?

Hladové algoritmy (Greedy Algorithms) Požadavky na úlohu vlastnost hladového výběru - výběr podproblému a pak jeho řešení optimální podstruktura - optimální řešení problému obsahuje optimální řešení podproblému Postup shora – dolů (v dynamickém programování to je zdola – nahoru) Příklad - Jarník-Prim algoritmus: výběr "nejlepšího" z n uzlů mimo dílčí podstrom pro přidání úprava kritéria pro jeho sousedy pak totéž pro (n-1) uzlů, atd.

Hladové algoritmy - příklad Příklad – návrh optimální větvící struktury programu test1 test2 test3 0.5 0.3 0.15 0.05 0.5 0.3 0.15 0.05 2.0 Známe relativní četnost průchodu jednotlivými větvemi ? Jaký bude průměrný počet testů potřebných k větvení?  wi. hl(ui)

vnější w-délka Ew(Tu) =  wi. hl(ui) Hladové algoritmy - příklad Obecná formulace: Pravidelný kořenový strom Tu stupně r s n listy, které jsou ohodnoceny reálnými čísly wi = w(ui) vnější w-délka Ew(Tu) =  wi. hl(ui) Jak vypadá strom s minimální vnější w-délkou ? 2.0 1.7 2.75 0.5 0.05 0.3 0.15 0.5 0.3 0.15 0.05 0.15 0.5 0.05 0.3

prefixový kód - žádné slovo není prefixem jiného slova Hladové algoritmy - příklad Jiná aplikace - generování optimálního prefixového kódu prefixový kód - žádné slovo není prefixem jiného slova Jsou dány znaky a jejich četnosti (absolutní/relativní) v textu znak A B C D E F G H I J četnost 52 5 18 13 21 4 2 3 35 7 kód 10 11000 000 001 111 11001 110100 110101 01 11011 1 162 66 I:35 C:18 D:13 31 A:52 94 E:21 42 B:5 F:4 9 21 J:7 12 G:2 H:3 5 160 1 průměrná délka kódu 2.75 (proti 4.0)

Zobecnění pro libovolné r (stupeň stromu) je přímočaré ... Huffmanův algoritmus (pro r=2) void Huffman(Weights w, int n) { Q.Init(); for (int i=1; i<=n; i++) { u = MakeNode(w[i]); Q.Push(u); } for (int i=1; i<n; i++) { x = Q.ExtMin(); y = Q.ExtMin(); z = MakeNode(w[x]+w[y]); z.left = x; z.right = y; Q.Push(z); return Q.ExtMin(); Zobecnění pro libovolné r (stupeň stromu) je přímočaré ...

Kontrolní otázky 6.13 Upravte Huffmanův algoritmus tak, aby vytvářel minimální pravidelný strom se zadaným stupněm r. 6.14 Dokažte, že hodnotu Ew vnější w-délky pravidelného stromu vytvořeného Huffmanovým algoritmem lze spočítat jako součet ohodnocení všech jeho vnitřních uzlů.