stromy
DESCRIPTION
Stromy. Opakování. Co je to graf? Co je to sled, tah, cesta? Co je to eulerovský a hamiltonovský graf? Co je to (slabě / silně) souvislý graf? Co je to izomorfismus grafů? Co je to matice sousednosti? Co je to matice incidence? Jak jinak lze implementovat graf?. Definice pojmů. - PowerPoint PPT PresentationTRANSCRIPT
Teoretická informatika
Opakování
• Co je to graf?• Co je to sled, tah, cesta?• Co je to eulerovský a hamiltonovský graf?• Co je to (slabě / silně) souvislý graf?• Co je to izomorfismus grafů?• Co je to matice sousednosti?• Co je to matice incidence?• Jak jinak lze implementovat graf?
strana 2
Teoretická informatika
Definice pojmů
• Graf bez kružnic (acyklický graf) se nazývá les
• Souvislý les se nazývá strom• Les je tedy takový graf, jehož každou
komponentou je strom• Stromy mohou být
– neorientované– orientované (kořenové)
Teoretická informatika
Vlastnosti stromů
• Je dán strom G = (U, H, f). Pak |H| = |U| – 1 – důkaz indukcí přes počet uzlů stromu
• Mezi každými dvěma uzly stromu vede jediná cesta
• Přidáním jedné nové hrany do stromu vznikne kružnice (právě jedna)
• Každý uzel stromu je artikulace, každá hrana stromu je most
• Strom je minimální souvislý graf na daných vrcholech
strana 4
Teoretická informatika
Neorientované stromy
• Uzel se stupněm 1 nazveme list.• Každý strom obsahuje alespoň jeden
list– v grafu, kde stupeň každého uzlu ≥ 2
musí existovat kružnice
• Graf vzniknuvší ze stromu odstraněním libovolného listu a s ním incidentní hrany, je opět strom.
strana 5
Teoretická informatika
Kořenový strom I.
• Orientovaný strom je graf, jehož symetrizace je strom.
• Jestliže vybereme jeden uzel, který nazveme kořen, a všechny hrany jsou orientovány směrem od kořene, získáváme kořenový strom.
• Pro daný uzel pak hovoříme o – předchůdcích (rodičích)– následnících (potomcích)– sousedech (sourozencích)
• Uzel bez potomků se nazývá list– vstupní stupeň = 1, výstupní stupeň = 0
Teoretická informatika
Kořenový strom II.
• Vzdálenost uzlu od kořene se nazývá výška uzlu.
• Výška stromu je výška uzlu (listu) s největší výškou.
• Liší-li vzdálenost (délka cesty) mezi kořenem a všemi listy nejvýše o 1, mluvíme o vyváženém stromu
Teoretická informatika
Aplikace stromů
• Uzlově ohodnocený strom• Binární vyhledávací strom
– složitost vyhledávání je log(n) a ne n• je-li strom vyvážený
• Řazení algoritmem heap-sort– časová složitost n*log(n)
• Kódování– Morse, Huffmann, …
Teoretická informatika
Binární vyhledávací strom
• Binární vyhledávací strom (BST) je uspořádaný binární uzlově ohodnocený strom, v němž pro každý uzel platí– hodnoty v levém podstromu jsou menší, než hodnota
v daném uzlu– hodnoty v pravém podstromu jsou větší, než
hodnota v daném uzlu– někdy připouštíme i rovnost, ale jen v 1 směru
• Algoritmy:– vyhledání uzlu– přidání uzlu– odebrání uzlu
Teoretická informatika
BVS: Vyhledávání
strana 10
• Vstup: strom T, klíč k
• Výstup: ukazatel na uzel s klíčem k nebo NULL
• Otázka: Jak implementovat vkládání a rušení uzlu?
Teoretická informatika
AVL stromy
• Pojmenován po autorech– Adelson-Velskii a Landis
• Samovyvažující binární vyhledávací strom• Pro každý uzel platí
– v levém podstromu jsou menší klíče– v pravém podstromu jsou větší klíče– výška levého a pravého podstromu se liší
nejvýše o 1• U každého uzlu koeficient vyváženosti
– rozdíl výšek levého a pravého podstromu
Teoretická informatika
Vkládání uzlu do AVL stromu
• Vložíme uzel jako v BVS• Aktualizujeme koeficienty vyváženosti• Provedeme vyvážení pomocí
cyklických záměn ukazatelů– levá nebo pravá rotace: novým kořenem
se stává kořen vyššího podstromu– maximálně dvě (protisměrné) rotace na
jedno vložení
Teoretická informatika
Vyvažování AVL stromu: levá rotace
• Pravý podstrom o 2 vyšší než levý– v pravém podstromu je vyšší pravý podstrom
• Analogicky pravá rotace
strana 13
zdroj: wikipedia
Teoretická informatika
Vyvažování AVL stromu: dvojitá rotace
• Pravý podstrm o 2 vyšší než levý– v pravém podstromu vyšší levý podstrom
• Analogicky opačné rotace
strana 14
Teoretická informatika
Rušení uzlu z AVL stromu
• Je-li rušený uzel list, odebereme jej
• Není-li, je třeba jej nahradit nejlevějším uzlem pravého podstromu nebo nejpravějším uzlem levého podstromu– Ten může mít maximálně 1 podstrom; jeho kořen jde
na místo zrušeného uzlu
• Aktualizujeme koeficienty vyváženosti až ke kořeni– V případě potřeby provedeme vyvážení
Teoretická informatika
Halda (heap)
• Statická reprezentace prioritního stromu– zleva úplný vyvážený binární strom– každý uzel nese vyšší hodnotu, než všichni jeho
potomci– maximální hodnota je tedy v kořeni
• Pole, v němž jsou uzly určeny indexy– kořen má index 0– levý potomek uzlu s indexem n má index 2n+1– pravý potomek uzlu s indexem n má index 2n+2– rodič uzlu s indexem n má index [(n-1)/2]
• Halda šetří místo, protože není potřeba ukládat ukazatele
strana 16
Teoretická informatika
Vkládání do haldy
• Vložíme nový uzel na nejbližší volnou pozici tak, aby strom zůstal zleva úplný
• Dokud má vkládaný uzel větší prioritu, než jeho rodič, vyměníme je– “probubláváme” s uzlem směrem nahoru
na správné místo
• Maximální počet výměn je h = log2n
strana 17
Teoretická informatika
Vybírání z haldy
• Vždy vybíráme kořen– protože má nejvyšší prioritu
• Na jeho místo vložíme nejpravější list (L) maximální výšky– kvůli zachování levé úplnosti stromu
• Dokud má L nižší prioritu než některý z jeho potomků, vyměníme jej s potomkem vyšší priority– “probubláváme” s uzlem směrem dolů
• Maximální počet výměn je h = log2n
strana 18