Ogólne wiadomości o drzewach - Uniwersytet Ekonomiczny w
Transkrypt
Ogólne wiadomości o drzewach - Uniwersytet Ekonomiczny w
2010-11-24 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 2 1 2010-11-24 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) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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ł Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 4 2 2010-11-24 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) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 5 Implementacje drzew • • • • wektorowa, listowa, LCRS (Leftmost-Child, Right-Sibling), implementacja drzew binarnych. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 6 3 2010-11-24 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, • i-ty element wektory przechowuje numer rodzica i-tego węzła Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 7 Implementacja wektorowa 2/3 0 1 4 2 5 6 3 7 8 9 -1 0 0 0 1 1 2 2 3 3 0 1 2 3 4 5 6 7 8 9 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 4 2010-11-24 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 9 0 Implementacja listowa 1/2 1 4 2 5 6 7 0 1 2 1 4 5 2 6 7 3 8 9 4 - 5 - 6 - 7 - 8 - Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet w Krakowie 9 Ekonomiczny - 3 8 9 3 10 5 2010-11-24 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 11 Implementacja LCRS (Leftmost-Child, Right-Sibling) • 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). Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 12 6 2010-11-24 W LCRS A M Drzewo B N K 7 C L 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 X Y Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny 9 Y -2w Krakowie 13 Implementacja drzew binarnych W A M Drzewo B N K 6 L LC RC 0 A 4 5 1 B 2 3 2 K - - 3 L - - 4 M - - 5 N - - Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny 6w Krakowie W 0 1 każdy węzeł przechowuje referencje do lewego (LC - left child) oraz prawego (RC - right child) potomka 14 7 2010-11-24 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 15 Metoda preorder 1 2 3 5 8 4 6 9 10 7 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 16 8 2010-11-24 Metoda postorder 1 2 3 4 5 8 6 9 7 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. 10 Przechodzenie postorder: 2 8 9 5 10 6 3 7 4 1 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 17 Metoda inorder 1 2 3 5 8 4 6 9 10 7 Metoda inorder - odwiedzane jest lewe 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 18 9 2010-11-24 „Ręczna” implementacja metod poruszania się po drzewie 1/2 1 2 3 5 8 4 6 9 7 10 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 20 10 2010-11-24 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 325+* - notacja postfiksowa Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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> Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 22 11 2010-11-24 Dokument HTML jako drzewo 2/2 HTML HEAD TITLE BODY H1 UL LI LI BR LI LI Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie I 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 24 12 2010-11-24 Magazyn 1/3 <?xml version="1.0" encoding="ISO-8859-2"?> <?xml-stylesheet 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+)> ]> Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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> Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 26 13 2010-11-24 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> Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 27 Dokument XML jako drzewo Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 28 14 2010-11-24 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 29 Struktura przykładowego drzewa poszukiwao binarnych 5 4 2 6 5 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 30 15 2010-11-24 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 32 16 2010-11-24 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). Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 34 17 2010-11-24 ... • Wyznacza się częstości wystąpienia każdego ze znaków – – – – A B C D (45%) (15%) (35%) (5%) • Porządkuje się elementy względem częstości występowania (od najrzadziej do najczęściej występującego) – – – – D B C A (5%) (15%) (35%) (45%) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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 • A (35%) (45%) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 36 18 2010-11-24 ... • krok 2 – połączenie (D, B) i C – A – ((D, B), C) (45%) (55%) • krok 3 – połączenie A i ((D, B), C) – (A, ((D, B), C)) (100%) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie B 38 19 2010-11-24 ... • Długośd tekstu zakodowanego: – – – – – A: 1 * 0.45 * 1000 = B: 3 * 0.15 * 1000 = C: 2 * 0.35 * 1000 = D: 3 * 0.05 * 1000 = SUMA: 450 bitów 450 bitów 700 bitów 150 bitów 1750 bitów Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 39 Dodawanie elementów do drzewa Dodawane elementy: 5, 4, 2, 5, 6, 8 kolejnośd losowa Drzewo zrównoważone 5 4 2 6 5 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 40 20 2010-11-24 Dodawanie elementów do drzewa kolejnośd wynikająca z uporządkowania elementów Dodawane elementy: 2, 4, 5, 5, 6, 8 2 4 5 Drzewo niezrównoważone 5 6 8 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 41 Drzewa czerwono-czarne • • • • • 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). Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 42 21 2010-11-24 Przykładowe drzewo czerwono-czarne drzewo czerwono-czarne jest w przybliżeniu drzewem zrównoważonym Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 43 Niezachowanie własności drzew czerwono-czarnych • Niezachowanie własności drzew czerwono-czarnych 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) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 44 22 2010-11-24 Rotacja Rotacja zachowuje porządek inorder węzłów drzewa Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 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 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 46 23 2010-11-24 Implementacja w języku Java • Klasy TreeSet oraz TreeMap wykorzystują drzewa czerwonoczarne do przechowania uporządkowanych zbiorów elementów (bez powtórzeo) Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 47 24