8 Podklady ředmětu ro akademický rok 2013/2014 Radim Farana Obsah 2 Dynamické datové struktury. Strom. Binární stromy. Vyhledávací stromy. Vyvážené stromy. AVL stromy. Strom 3 Název z analogie se stromy. Základní rvek uzel, vrchol. Odkazy na konečný očet odstromů. Stueň stromu maximální očet odstromů. list větev větev list délka větve hloubka stromu htt://office.microsoft.com/cs-cz/cliart/default.asx výška stromu 1
Strom 4 Kořen základní rvek stromu, nemá ředchůdce, jen následníky. Prázdný strom neobsahuje žádný rvek. Prvky se stejnou vzdáleností od e leží na stejné úrovni. Maximální úroveň = hloubka (výška) stromu. Délka cesty k rvku očet sojnic na cestě od e k rvku. Součet délek cesty všech rvků délka cesty stromu. Strom 5 Minimální délku má strom jestliže na každé úrovni kromě oslední má maximální možný očet rvků. Pak má současně minimální hloubku. Binární strom 6 Každý rvek má nejvýše dva následníky. klíč data klíč data klíč data 2
Vyhledávací strom 7 Vyhledávací stromy jsou stromy, u kterých zařazujeme rvky odle klíčové oložky tak, že ro všechny rvky latí následník má vždy nižší hodnotu klíče než rvek a ravý následník hodnotu vyšší. Algoritmy ráce se stromy jsou velmi často rekurzívní. Binární vyhledávací strom 8 hledej (klíč, ByRef rvek) w = rvek if w = nil then new(w) w.klíč = klíč w.data = data w. = nil w.ravý = nil if klíč < w.klíč then hledej (klíč, w.) if klíč > w.klíč then hledej (klíč, w.ravý) REM zracování dat w.data end hledej Vyhledávání a vkládání rvků do stromu Nebezečí: Degenerace stromu na lineární seznam ři vkládání rvků v ořadí odle velikosti. Přetečení zásobníku ři rekurzivním volání. Binární vyhledávácí strom 9 h = true w = while w <> nil and h if w.klíč = klíč then if w.klíč > klíč then w = w. w = w.ravý end while Vyhledávání rvků iterační algoritmus 3
Binární vyhledávací strom 10 rojdi (rvek) if rvek <> nil then rojdi (rvek.) zracování dat rvek.data rojdi (rvek.ravý) end rojdi Procházení a zracování rvků stromu v ořadí jejich klíčů zruš (ByRef rvek) if rvek <> nil then zruš (rvek.) zruš (rvek.ravý) disose() end zruš Zrušení celého stromu Binární vyhledávací strom 11 Vyhledávání a rušení rvku 4 klíč = 8 rvek 4 0 náhrada q 0 klíč = 9 klíč =12 klíč = 30 1 Binární vyhledávací strom 12 vezmi (klíč, ByRef rvek) if rvek = nil REM hledaný rvek ve stromu není if klíč<rvek.klíč then vezmi (klíč, rvek.) if klíč>rvek.klíč then vezmi (klíč, rvek.ravý) REM hledaný rvek byl nalezen q = rvek if q.ravý = nil then rvek = q. if q. = nil then rvek = q.ravý najdi (q.) disose (q) end vezmi Vyhledávání a rušení rvků stromu najdi (ByRef náhrada) if náhrada.ravý<>nil najdi (náhrada.ravý) q.klíč = náhrada.klíč q.data = náhrada.data q = náhrada náhrada = náhrada. end najdi 4
Vyvážený strom 13 Odstranění nebezečí degenerace stromu. Konstrukce stromu s minimální hloubkou. Strom je vyvážený, jestliže ro každý rvek latí, že očet rvků v jeho levém a ravém odstromu se liší nejvýše o jeden rvek. Vyvážený strom 14 Nejjednodušší je umisťování rvků střídavě na levou a ravou stranu stromu strukturování stromu: zvolíme jeden z rvků jako stromu, vytvoříme odstrom s očtem n l = n div 2 rvků. vytvoříme ravý odstrom s očtem n r = n - n l -1 rvků Výsledný strom je dokonale vyvážený. Pro realizaci vyhledávacího stromu ři náhodném vkládání rvků je o každém vložení nutná restrukturalizace stromu. AVL-strom 15 Strom je vyvážený rávě tehdy, když se výšky obou odstromů každého rvku liší nejvýše o jeden rvek. Formulovali: Adelson-Velskij a Landis. V nejhorším říadě bude AVL-strom o 45 % vyšší než dokonale vyvážený strom. Se složitostí O(log n) lze realizovat všechny základní oerace vložení, vyhledání i zrušení rvku s daným klíčem 5
AVL-strom 16 Po vložení nového rvku do levého odstromu se z ohledu rvku: vyváženost zleší, okud výška levého byla menší než u ravého odstromu, vyváženost se zhorší, ale neoruší, okud byly obě výšky stejné, vyváženost se oruší, okud výška levého odstromu byla větší než u ravého, vyváženost je třeba uravit. Orava vyvážení se realizuje rotacemi. AVL-strom 17 Prvek AVL-stromu, roměnná vaz má hodnoty: -1 : odstrom je delší, 0 : oba odstromy mají stejnou délku, 1 : ravý odstrom je delší. Proměnné: ukazatel na rvek, h informace o zvětšení výšky. klíč vaz data AVL-strom, rotace RR 18 Porušení zůsobil u ravého následníka ravý odstrom RR rotace Jednoduchá rotace RR 1 1 =.ravý.ravý = 1. 1. =. = 1. 6
AVL-strom, rotace LL 19 Porušení zůsobil u levého následníka odstrom. LL rotace ravý Jednoduchá rotace LL 1 1 =.. = 1.ravý 1.ravý =. = 1 ravý. AVL-strom, LR-rotace 1 =. 2 = 1.ravý 1.ravý = 2. 2. = 1. = 2.ravý 2.ravý = if 2. then.. if 2. then 1. 1. = 2. 1 klíč = 3 ravý 2 Dvojitá LR rotace LR rotace 1 klíč = 3 ravý 2 20 AVL-strom, RL-rotace 1 =.ravý 2 = 1. 1. = 2.ravý 2.ravý = 1.ravý = 2. 2. = if 2. then.. if 2. then 1. 1. = 2. klíč = 3 2 klíč = 6 Dvojitá RL rotace RL rotace 1 klíč = 3 klíč = 6 2 21 1 7
AVL-strom, vkládání rvků 22 hledej1 (ByRef, ByRef h) if = nil REM vložení nového rvku do roměnné, h = true if klíč <.klíč then hledej1 (.,h) if h then case.. case.. case. 1 =. if 1. then REM rotace LL REM rotace LR. end case if klíč >.klíč then hledej1 (.ravý,h) if h then case 1. 1. case 1.. case 1. 1.vaz = ravý if 1. then REM rotace RR REM rotace RL 1. end case REM zracování dat.data, end hledej1 8