Ogólne wiadomości o drzewach Algorytmy i struktury danych Wykład 4. Rok akademicki: 2010/2011 Drzewo jako struktura danych Drzewo kolekcja elementów pozostających w zależności hierarchicznej, posiadająca jeden element wyróżniony zwany korzeniem drzewa. 2 1
Pojęcia związane z drzewem 1/2 węzeł element drzewa, krawędź połączenie występujące w drzewie, korzeo drzewa początkowy element drzewa, rodzic, przodek element nadrzędny dziecko, potomek element podrzędny liśd węzeł nie posiadający potomków węzeł wewnętrzny węzeł posiadający potomków poddrzewo rozpatrywany element wraz ze wszystkimi jego potomkami (bezpośrednimi i pośrednimi) 3 Pojęcia związane z drzewem 2/2 wysokośd drzewa długośd najdłuższej ścieżki od korzenia do liścia poziom węzła (głębokośd węzła) długośd ścieżki od korzenia do danego węzła. stopieo węzła liczba posiadanych przez węzeł potomków elementy siostrzane węzły posiadające tego samego rodzica co rozpatrywany węzeł 4 2
Rodzaje drzew drzewo uporządkowane drzewo, w którym potomkowie węzłów występują w ściśle określonej kolejności (np. alfabetycznej) drzewo etykietowane drzewo, w którym węzły lub krawędzie mają przypisane nazwy i/lub wartości drzewo binarne drzewo, w którym węzły mają co najwyżej dwóch potomków (potomek lewy oraz potomek prawy) 5 Implementacje drzew wektorowa, listowa, LCRS (LeftmostChild, RightSibling), implementacja drzew binarnych. 6 3
Implementacja wektorowa 1/3 implementacja wektorowa = implementacja rodzicielska, elementy drzewa należy ponumerowad kolejnymi liczbami całkowitymi, utworzyd wektor o liczbie elementów zgodnej z liczbą węzłów, ity element wektory przechowuje numer rodzica itego węzła 7 Implementacja wektorowa 2/3 0 1 2 3 4 5 6 7 8 9 1 0 0 0 1 1 2 2 3 3 0 1 2 3 4 5 6 7 8 9 8 4
Implementacja wektorowa 3/3 Cechy implementacji wektorowej: prosta, umożliwia prostą wędrówkę w kierunku korzenia drzewa, wędrówka od korzenia w kierunku liści wymaga sekwencyjnego przeglądnięcia wektora. 9 Implementacja listowa 1/2 0 1 2 3 4 5 6 7 8 9 0 1 2 3 1 2 3 4 5 6 7 8 9 4 5 6 7 8 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet 9 Ekonomiczny w Krakowie 10 5
Implementacja listowa 2/2 pozwala na łatwą wędrówkę od korzenia w kierunku liści, trudna jest wędrówka w kierunku korzenia wymaga sekwencyjnego przeglądania list potomków. 11 Implementacja LCRS (LeftmostChild, RightSibling) węzły identyfikowane są przez etykiety, a nie indeksy pozwala na stosunkowo proste poruszanie się po drzewie w obu kierunkach, pozwala na realizację zaawansowanych operacji na drzewie (np. łączenie drzew). 12 6
LCRS W A B C M N K L X Y Drzewo 7 LC RS 0 A 5 1 1 B 3 2 2 C 8 7 3 K 4 4 L 1 5 M 6 6 N 0 7 W 0 8 X 9 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet 9 YEkonomiczny 2w Krakowie 13 Implementacja drzew binarnych W A B M N K L Drzewo 6 LC RC 0 A 4 5 1 B 2 3 każdy węzeł przechowuje referencje do lewego (LC left child) oraz prawego (RC right child) potomka 2 3 4 K L M 5 N Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny 6 w Krakowie W 0 1 14 7
Poruszanie się po drzewie sposób poruszania się po drzewie kolejnośd odwiedzania węzłów trzy podstawowe metody poruszania się po drzewie: preorder, postorder, inorder. 15 Metoda preorder 1 2 3 4 5 6 7 8 9 10 Metoda preorder rozpoczyna się od korzenia drzewa, a następnie odwiedzane są wszystkie jego poddrzewa w kolejności od lewej do prawej strony Przechodzenie preorder: 1 2 3 5 8 9 6 10 4 7 16 8
Metoda postorder 1 2 3 4 5 6 7 8 9 10 Metoda postorder w pierwszej kolejności odwiedzane są wszystkie poddrzewa w kolejności od lewej do prawej strony, a następnie odwiedzany jest korzeo drzewa. Przechodzenie postorder: 2 8 9 5 10 6 3 7 4 1 17 Metoda inorder 1 2 3 4 5 6 7 Metoda inorder odwiedzane jest lewe 8 9 10 skrajne poddrzewo, następnie korzeo drzewa, po czym następuje przejście przez pozostałe poddrzewa w kolejności od lewej do prawej strony. Przechodzenie inorder: 2 1 8 5 9 3 10 6 7 4 18 9
Ręczna implementacja metod poruszania się po drzewie 1/2 1 2 3 4 5 6 7 8 9 10 19 Ręczna implementacja metod poruszania się po drzewie 2/2 wychodząc od korzenia drzewa należy odwiedzid wszystkie jego elementy w kierunku przeciwnym do ruchu wskazówek zegara, sposób dalszego postępowania jest uzależniony od metody poruszania się po drzewie: metoda preorder należy wypisad etykietę każdego węzła przy jego pierwszym odwiedzeniu, czyli uzyskamy: 1, 2, 3, 5, 8, 9, 6, 10, 4, 7 metoda postorder należy wypisad etykietę każdego węzła przy jego ostatnim odwiedzeniu, co daje: 2, 8, 9, 5, 10, 6, 3, 7, 4, 1 metoda inorder: jeżeli węzeł jest liściem, to jego etykieta jest wypisywana przy pierwszym odwiedzeniu, jeżeli węzeł jest węzłem wewnętrznym, to jego etykieta jest wypisywana przy drugim odwiedzeniu. co daje w rozpatrywanym przykładzie: 2, 1, 8, 5, 9, 3, 10, 6, 7, 4 20 10
Drzewa wyrażeo arytmetycznych * 3 + 2 5 3 * (2 + 5) notacja infiksowa Poruszanie się po drzewie w porządku preorder 3 + 2 5 notacja prefiksowa Poruszanie się po drzewie w porządku postorder 3 2 5 + * notacja postfiksowa 21 Dokument HTML jako drzewo 1/2 <HTML> <HEAD> <TITLE>Publikacja</TITLE> </HEAD> <BODY> <H1>Spis treści</h1> <UL> <LI>Wstęp</LI> <LI>Przebieg badao</li> <LI>Rezultaty</LI> <LI>Wnioski koocowe</li> </UL> <BR> <I>Data ostatniej aktualizacji: <B>1 marca 2003</B></I> </BODY> </HTML> 22 11
Dokument HTML jako drzewo 2/2 HTML HEAD BODY TITLE H1 UL BR I LI LI LI LI B 23 Dokument XML jako drzewo Język XML: pozwala na definiowanie struktury przechowywanych zasobów danych, umożliwia przechowywanie danych, pozwala na określenie sposobu przekształcania zgromadzonych zasobów. 24 12
Magazyn 1/3 <?xml version="1.0" encoding="iso88592"?> <?xmlstylesheet type="text/css" href="styl.css"?> <!DOCTYPE MAGAZYN [ <!ELEMENT NAZWA (#PCDATA)> <!ELEMENT PRODUCENT (#PCDATA)> <!ELEMENT CENA (#PCDATA)> <!ELEMENT TOWAR (NAZWA, PRODUCENT?, CENA)> <!ELEMENT TYTUL (#PCDATA)> <!ELEMENT MAGAZYN (TYTUL?,TOWAR+)> ]> 25 Magazyn 2/3 <MAGAZYN> <TYTUL>STAN MAGAZYNU</TYTUL> <TOWAR> <NAZWA>Chleb wiejski</nazwa> <PRODUCENT>Piekarnia "Tradycyjna"</PRODUCENT> <CENA>1.70</CENA> </TOWAR> <TOWAR> <NAZWA>Masło domowe</nazwa> <PRODUCENT>Społdzielnia Mleczarska</PRODUCENT> <CENA>2.50</CENA> </TOWAR> 26 13
Magazyn 3/3 <TOWAR> <NAZWA>Masło domowe</nazwa> <PRODUCENT>Społdzielnia Mleczarska</PRODUCENT> <CENA>2.50</CENA> </TOWAR> <TOWAR> <NAZWA>Zapałki</NAZWA> <CENA>0.35</CENA> </TOWAR> </MAGAZYN> 27 Dokument XML jako drzewo 28 14
Drzewo poszukiwao binarnych Drzewo poszukiwao binarnych drzewo binarne, etykietowane, w którym dla każdego węzła spełniona jest następująca zależnośd: etykiety węzłów znajdujących się w jego lewym poddrzewie są nie większe od etykiety przypisanej rozpatrywanemu węzłowi, etykiety węzłów znajdujących się w jego prawym poddrzewie są nie mniejsze od etykiety przypisanej rozpatrywanemu węzłowi. 29 Struktura przykładowego drzewa poszukiwao binarnych 5 4 6 2 5 8 30 15
Działania na drzewie poszukiwao binarnych Wyświetlanie elementów w sposób uporządkowany przejście po drzewie metodą inorder: 2, 4, 5, 5, 6, 8 Wyznaczanie wartości minimalnej przejście od korzenia do liścia, wybierając zawsze lewe poddrzewo: 5, 4, 2 Wyznaczanie wartości maksymalnej przejście od korzenia do liścia, wybierając zawsze prawe poddrzewo: 5, 6, 8 31 Wyszukiwanie zadanej wartości w drzewie poszukiwao binarnych Wyszukiwanie wartości w drzewie poszukiwao binarnych szukaj(wartośd, drzewo) { if (drzewo = null) or (wartośd = etykieta(drzewo)) return drzewo if (wartośd < etykieta(drzewo) return szukaj(wartośd, lewepoddrzewo(drzewo)) else return szukaj(wartośd,prawepoddrzewo(drzewo)) } Zastosowania: struktury słownikowe listy przeszukiwanych wartości 32 16
Kodowanie Huffmana metoda kompresji bezstratnej (przydatna do kompresji tekstów, programów), metoda ta wykorzystuje różnice w częstościach występowania poszczególnych znaków w tekście (krótsze kody przypisywane są znakom częściej się pojawiającym, zaś dłuższe znakom rzadko występującym), metoda ta wykorzystywana jest w popularnych programach pakujących (np. pkzip, arj). 33 Kodowanie Huffmana przykład Załóżmy, że: w tekście występują tylko cztery znaki: A, B, C, D, długośd tekstu wynosi 1000 znaków Przed kompresją: do zakodowania jednego znaku potrzebne są 2 bity: A 00; B 01; C 10; D 11 do zakodowania tekstu o długości 1000 znaków potrzeba 2000 bitów. 34 17
... Wyznacza się częstości wystąpienia każdego ze znaków A (45%) B (15%) C (35%) D (5%) Porządkuje się elementy względem częstości występowania (od najrzadziej do najczęściej występującego) D (5%) B (15%) C (35%) A (45%) 35... w kolejnych krokach pobiera się dwa najrzadziej występujące elementy, łączy w jeden i umieszcza na odpowiedniej pozycji listy krok 1 połączenie elementów D i B (D, B) (20%) C (35%) A (45%) 36 18
... krok 2 połączenie (D, B) i C A (45%) ((D, B), C) (55%) krok 3 połączenie A i ((D, B), C) (A, ((D, B), C)) (100%) 37... kody znaków wyznaczają ścieżkę prowadzącą od korzenia do danego znaku (0 lewa gałąź, 1 prawa gałąź) A 0 B 101 C 11 D 100 A C D B 38 19
... Długośd tekstu zakodowanego: A: 1 * 0.45 * 1000 = 450 bitów B: 3 * 0.15 * 1000 = 450 bitów C: 2 * 0.35 * 1000 = 700 bitów D: 3 * 0.05 * 1000 = 150 bitów SUMA: 1750 bitów 39 Dodawanie elementów do drzewa Dodawane elementy: 5, 4, 2, 5, 6, 8 kolejnośd losowa 5 Drzewo zrównoważone 4 6 2 5 8 40 20
Dodawanie elementów do drzewa Dodawane elementy: 2, 4, 5, 5, 6, 8 2 kolejnośd wynikająca z uporządkowania elementów 4 5 5 Drzewo niezrównoważone 6 8 41 Drzewa czerwonoczarne każdy węzeł ma jeden z dwóch kolorów: czerwony lub czarny, korzeo ma kolor czarny, każdy pusty liśd (NIL) jest czarny, synowie czerwonego wierzchołka są czarni, każda ścieżka z korzenia do jakiegokolwiek liścia zawiera tą samą liczbę czarnych węzłów (czarna wysokośd). 42 21
Przykładowe drzewo czerwonoczarne drzewo czerwonoczarne jest w przybliżeniu drzewem zrównoważonym 43 Niezachowanie własności drzew czerwonoczarnych Niezachowanie własności drzew czerwonoczarnych powoduje, że drzewo traci charakter zrównoważony Przyczyną niezachowania własności jest: wstawienie, usunięcie elementu. W celu przywrócenia własności stosuje się metodę: rotacji, ponownego kolorowania węzłów (przekolorowywania) 44 22
Rotacja Rotacja zachowuje porządek inorder węzłów drzewa 45 Dodawanie elementu do drzewa Określenie położenia nowego elementu jak w drzewie poszukiwao binarnych Przypisanie nowemu elementowi koloru czerwonego: Jeżeli rodzic wstawionego węzła jest czarny to własnośd drzewa została zachowana. Jeżeli rodzic wstawionego węzła jest czerwony to własnośd drzewa została zaburzona (rodzic i syn mają kolor czerwony). Aby przywrócid własnośd należy przekolorowad niektóre węzły i dokonad rotacji węzłów 46 23
Implementacja w języku Java Klasy TreeSet oraz TreeMap wykorzystują drzewa czerwonoczarne do przechowania uporządkowanych zbiorów elementów (bez powtórzeo) 47 24