Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Podobne dokumenty
ALGORYTMY I STRUKTURY DANYCH

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Drzewa poszukiwań binarnych

Wysokość drzewa Głębokość węzła

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Porządek symetryczny: right(x)

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Wykład 2. Drzewa poszukiwań binarnych (BST)

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

Drzewa czerwono-czarne.

Sortowanie bąbelkowe

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Podstawy Informatyki. Metody dostępu do danych

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Wykład 6. Drzewa poszukiwań binarnych (BST)

Struktury danych: stos, kolejka, lista, drzewo

Algorytmy i Struktury Danych

Wykład 8. Drzewa AVL i 2-3-4

Tadeusz Pankowski

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Listy, kolejki, stosy

Drzewa wyszukiwań binarnych (BST)

Algorytmy i struktury danych. wykład 5

Drzewa poszukiwań binarnych

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Wykład 3. Drzewa czerwono-czarne

Struktury Danych i Złożoność Obliczeniowa

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Teoretyczne podstawy informatyki

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Lista liniowa dwukierunkowa

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

ALGORYTMY I STRUKTURY DANYCH

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Algorytmy i Struktury Danych

ALGORYTMY I STRUKTURY DANYCH

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

AiSD zadanie drugie. Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5. 10 kwietnia 2008

Podstawowe struktury danych

Algorytmy i Struktury Danych, 9. ćwiczenia

Drzewo binarne BST. LABORKA Piotr Ciskowski

Strategia "dziel i zwyciężaj"

Teoretyczne podstawy informatyki

Drzewa podstawowe poj

Lokalizacja jest to położenie geograficzne zajmowane przez aparat. Miejsce, w którym zainstalowane jest to urządzenie.

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Bazy danych - BD. Indeksy. Wykład przygotował: Robert Wrembel. BD wykład 7 (1)

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Abstrakcyjne struktury danych - stos, lista, drzewo

Poprawność semantyczna

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Wstęp do programowania

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Koszt zamortyzowany. Potencjał - Fundusz Ubezpieczeń Kosztów Algorytmicznych

Algorytmy i Struktury Danych.

Algorytmy i struktury danych

Instrukcje dla zawodników

Wstęp do programowania

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Algorytmy i struktury danych

Drzewa AVL definicje

Przykładowe B+ drzewo

Dynamiczne struktury danych

Algorytmy i Struktury Danych

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

Algorytm selekcji Hoare a. Łukasz Miemus

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Podstawy Informatyki. Wykład 6. Struktury danych

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Programowanie obiektowe

BAZY DANYCH. Microsoft Access. Adrian Horzyk OPTYMALIZACJA BAZY DANYCH I TWORZENIE INDEKSÓW. Akademia Górniczo-Hutnicza

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Egzaminy i inne zadania. Semestr II.

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Definicja pliku kratowego

Programowanie obiektowe

Dynamiczne struktury danych

Sortowanie - wybrane algorytmy

Nierówność Krafta-McMillana, Kodowanie Huffmana

Struktury Danych i Złożoność Obliczeniowa

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Matematyka dyskretna - 7.Drzewa

Programowanie obiektowe i C++ dla matematyków

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

Typy danych. 2. Dane liczbowe 2.1. Liczby całkowite ze znakiem i bez znaku: 32768, -165, ; 2.2. Liczby rzeczywiste stało i zmienno pozycyjne:

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wykład 5. Sortowanie w czasie liniowologarytmicznym

x 2 = a RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych 2. Proste równania kwadratowe Równanie kwadratowe typu:

BAZY DANYCH. Microsoft Access. Adrian Horzyk OPTYMALIZACJA BAZY DANYCH I TWORZENIE INDEKSÓW. Akademia Górniczo-Hutnicza

Przekształcanie wykresów.

Transkrypt:

Drzewa ST i VL Drzewa poszukiwań binarnych (ST) Drzewo ST to dynamiczna struktura danych (w formie drzewa binarnego), która ma tą właściwość, że dla każdego elementu wszystkie elementy w jego prawym poddrzewie są od niego większe, a wszystkie elementy w lewym poddrzewie są od niego mniejsze. Takie uporządkowanie struktury umożliwia w niej wyszukiwanie elementów w sposób analogiczny do wyszukiwania binarnego przy jednoczesnym zachowaniu elastyczności struktury (możliwość szybkiego dodawania lub usuwania elementów). Drzewo ST jest strukturą, którą implementuje się za pomocą dowiązań (wskaźniki/referencje), a pamięć dla poszczególnych węzłów jest alokowana dynamicznie. Program operujący na drzewie ST potrzebuje jedynie informacji o jego korzeniu (wskaźnik na pierwszy element drzewa). Każdy węzeł poza danymi potrzebuje jeszcze wskazań na lewego i prawego syna. raki poddrzew oznaczane są symbolem null. Poniżej przykład drzewa ST oraz definicji struktury węzła (++): struct Wezel{ int liczba; Wezel* lewy; Wezel* prawy; }; lewy korzen prawy 5 4 null 8 null null null null null null Wyszukiwanie w drzewie ST polega na porównywaniu szukanego elementu do aktualnego węzła i w zależności od tego, który element jest większy następuje przesunięcie do prawego lub lewego poddrzewa. Poszukiwanie jest przerywane, gdy element zostaje znaleziony lub osiągnięty zostanie kres drzewa (null). Poniżej przykład wyszukania elementu 3 w drzewie oraz kod (++): bool szukaj(int n, Wezel* korzen){ while(korzen!=null){ if(korzen >liczba==n) return true; if(n>korzen >liczba) korzen=korzen >prawy; else korzen=korzen >lewy; } return false; } 5 8 3 > 4 3 < 4 3 > RK

Dodawanie do drzewa ST odbywa się analogicznie jak wyszukiwanie. Najpierw szukamy miejsca, w którym element należy wstawić (faza wyszukiwania), a następnie jest on dodawany w do drzewa (o ile nie występuje już w drzewie). W przykładzie powyżej 3 trafiłaby na prawo od elementu, 7 zostałaby umieszczona na lewo od elementu 8, a trafiłoby na prawo od elementu 4. Poniżej przedstawiono drzewo ST powstałe po dodaniu kolejno liczb: 5,, 9, 7,, 5, 8,, 8: 5 9 5 7 8 8 Operacja usuwania w pierwszej fazie przebiega tak jak wyszukiwanie należy znaleźć element do usunięcia. Jeżeli element występuje w drzewie to należy podjąć odpowiednie kroki. W przypadku, gdy element nie ma synów (jest liściem) to po prostu zwalniamy pamięć przypisujemy null w odpowiednim poddrzewie jego ojca. Poniżej drzewo po usunięciu : 5 9 5 7 8 8 W drugim przypadku usuwany element na jedno dziecko. Wówczas proces usuwania przypomina usuwanie elementu z listy jednokierunkowej: łączy się ojca usuwanego elementu z jedynym dzieckiem tego elementu. Po usunięciu 5 drzewo wygląda więc następująco: 5 9 8 7 8

Najtrudniejszy jest trzeci przypadek, gdy usuwany element na dwójkę synów. Wówczas zostąpić go mogą tylko dwa elementy (by dalej zachowany był porządek ST): jego poprzednik i następnik. Są to elementy sąsiednie z usuwanym w hierarchii wszystkich elementów w drzewie. ch znalezienie nie jest trudne: poprzednik jest największym węzłem w lewym poddrzewie, a następnik najmniejszym węzłem w prawym poddrzewie. W dalszych założeniach przyjmujemy, że usuwany element będzie zastępowany przez swego następnika, a fizycznie z drzewa usuwany jest węzeł następnika (a nie węzeł usuwanego elementu). W przypadku usunięcia z drzewa 5 widzimy, że jego poprzednik to, a jego następnik to 7 (hierarchia: 8,,, 5, 7, 8, 9). W tej sytuacji liczba z następnika (7) zastępuje 5 w korzeniu (nie usuwamy węzła, w którym było 5), a sam węzeł, w którym była 7 jest fizycznie usuwany z drzewa. Zauważmy, że węzeł z następnika może mieć co najwyżej jedno dziecko (czemu), a więc rozważane są tutaj prostsze przypadki usuwania. Poniżej proces usunięcia 5 z drzewa: 5 7 7 9 9 8 7 8 8 8 Złożoność wszystkich operacji na drzewie ST jest wprost proporcjonalna do liczby poziomów w drzewie. W przypadku dobrze zrównoważonego drzewa złożoność jest więc logarytmiczna, ale w pewnych przypadkach (np. przy dodaniu do drzewa ST elementów posortowanych) drzewo może zdegenerować się do listy i złożoności podstawowych operacji będą liniowe. by zapobiec takiemu przypadkowi stosuje się pewne modyfikacje w drzewie ST, a przykładem jest drzewo VL. Drzewo VL Drzewo VL jest odmianą drzewa ST, w której dla każdego węzła zachodzi dodatkowy warunek związany ze strukturą drzewa: różnica pomiędzy liczbą poziomów lewego i prawego poddrzewa wynosi co najwyżej. Drzewo spełniające ten warunek w każdym węźle ma gwarantowaną logarytmiczną liczbę poziomów (w zależności od liczby elementów drzewa), co daje logarytmiczną pesymistyczną złożoność podstawowych operacji. nformacja o zrównoważeniu danego poddrzewa jest przechowywana w każdym węźle w postaci wag będących różnicą pomiędzy liczbą poziomów lewego i prawego poddrzewa. W prawidłowym drzewie VL wagi należą więc do zbioru {,, }. Poniżej przykład drzewa VL wraz z wagami. Przykładowo waga elementu 5 wynosi, ponieważ jego lewe poddrzewo ma 3 poziomy, a prawe poddrzewo ma poziomy (3=). 5 9 5 7 8

Najważniejszym mechanizmem w drzewie VL jest utrzymywanie zrównoważenia drzewa po operacjach modyfikacji (wstawianie i usuwanie elementów). Pierwsza faza tych operacji przebiega identycznie jak w drzewie ST. W drugiej fazie, poczynając od miejsca modyfikacji (wstawienia/usunięcia węzła), następuje powrót w górę drzewa (w stronę korzenia) i zmieniane są wagi napotkanych węzłów oraz następują tzw. rotacje (wyważanie drzewa). Po wstawieniu elementu, jeżeli następuje powrót z lewego poddrzewa, to waga aktualnego węzła jest zwiększana o jeden (przybyło z lewej strony). Jeżeli natomiast wracamy z prawego poddrzewa to wagę należy zmniejszyć o jeden (przybyło z prawej strony). W przypadku usunięcia jest dokładnie odwrotnie: wracając z lewego poddrzewa zmniejszamy o jeden wagę aktualnego węzła, a wracając z prawego poddrzewa zwiększamy o jeden wagę. Jeżeli po modyfikacji wagi została ona ustawiona na zero (w przypadku wstawiania), to proces wyważania jest przerywany (oznacza to, że dane poddrzewo po dodaniu elementu się zrównoważyło, ale jego całkowita liczba poziomów się nie zmieniła). Jeżeli po modyfikacji waga została ustawiona na lub (w przypadku usuwania), to także należy przerwać proces wyważania. Jeżeli po modyfikacji waga bieżącego węzła wynosi lub, to oznacza konieczność przeprowadzenia rotacji, czyli zmiany struktury drzewa. stnieją 4 typy rotacji. Poniżej ich schematy: rotacja RR rotacja LL rotacja LR rotacja RL V V V V W miejsce liter, i można wstawić dowolne elementy drzewa, natomiast symbole,, i V oznaczają dowolne poddrzewa (może to być duże poddrzewo, ale również null). W wyniku rotacji zmieniają się wagi wybranych elementów drzewa oraz struktura drzewa (zmiana dowiązań). Same poddrzewa (ozn. Liczbami rzymskimi) nie ulegają wewnętrznym modyfikacjom, a zmienia się jedynie ich lokalizacja w drzewie. Dzięki temu, że liczba zmian jest nieduża, to jednak rotacja ma koszt stały. Widoczne jest, że rotacja LL jest odbiciem lustrzanym rotacji RR (to są tzw. pojedyncze rotacje). Podobnie rotacja RL jest odbiciem rotacji LR. W przypadku rotacji podwójnych (LR oraz RL) wagi elementów i po rotacji zależą od wagi elementu przed rotacją (są trzy przypadki do rozpatrzenia). stnieje jeszcze taki przypadek, gdy waga elementu wynosi (może do tego dojść po usuwaniu): wówczas wystarczy przeprowadzić pojedynczą rotację i odpowiednio zmienić wagi.

Poniżej przedstawiony został rozbudowany przykład dodania do drzewa VL kilkunastu liczb oraz usunięcia kilku. Najpierw wstawiamy kolejno 3, 4, 5, i. ) wstaw 3 3 ) wstaw 4 3 3) wstaw 5 4 3 4) wstaw 4 5) wstaw 4 4 4 3 5 3 5 3 5 5 Miejsce wstawienia elementu wyszukiwane jest tak, jak w standardowym drzewie ST. Następnie wracając do korzenia zmieniamy o wagi kolejnych węzłów. Przykładowo po wstawieniu 5 wracamy do węzłów 4 oraz 3 i zmniejszamy im wagi o jeden (ponieważ w obu przypadkach powrót nastąpił z prawego poddrzewa). W przypadku wstawienia najpierw zmiejszamy o jeden wagę w elemencie 3 (powrót z prawej strony), a następnie zwiększamy o jeden wagę w elemencie 4 (powrót z lewej strony). Zauważmy, że po dodaniu 3 potrzebna była rotacja LL. W tym przypadku rolę elementu pełni 3, a rolę elementu pełni 4. Poddrzewa i są puste, a poddrzewo to pojedynczy element (5). W przypadku dodania elementu należało zwiększyć wagę elementu 3, co dało w rezultacie (pogrubione). Wyzerowanie wagi po wstawieniu elementu oznacza, że należy przerwać dalsze wyważenie drzewa (stąd w 4 waga nie została zmieniona). Oznacza to, że po wstawieniu elementu potrzebna jest co najwyżej jedna rotacja (po jej wykonaniu korzeń danego poddrzewa będzie miał wagę ). Poniżej drzewo po wstawieniu elementów, 6 i : 6) wstaw 4 rot. LR 7) wstaw 6 8) wstaw 3 5 3 4 3 4 3 4 5 5 5 6 6 Po wstawieniu następuje modyfikacja wag zgodnie z algorytmem (wracając z prawej strony wagę zmniejszamy o, a wracając z lewej strony zwiększamy o jeden). W korzeniu (4) został wykryty brak zrównoważenia (waga ) i nastąpiła rotacja LR. W tym przypadku to 4, to 3, a to. Poddrzewo to element, poddrzewo jest puste, poddrzewo to element, a poddrzewo V to element 5. Wstawienie 6 oraz przebiega bez uruchomienia rotacji. Ważne jest jednak, że po wstawieniu wracając do korzenia zmieniamy wagę elementu 4 na zero. W tym momencie ze względu na zerową wagę proces należy przerwać w korzeniu wagi już nie zmieniamy (co widać również z rysunku).

Poniżej drzewo po wstawieniu i 7: 8) wstaw 3 4 rot. RR 3 4 9) wstaw 7 3 4 3 4 5 5 5 6 6 6 6 5 7 7 Po wstawieniu tych elementów zaistniała potrzeba wykonania rotacji (odpowiednio RR i LL). Rotacja ta nie wystąpiła w korzeniu drzewa (jak poprzednie), ale w pewnych poddrzewach (oznaczonych przez elementy i 5). Po przeprowadzeniu rotacji drzewa się dalej nie wyważa (po rotacji pojawia się waga ). Poniżej ostateczne drzewo po wstawieniu elementów 8, 9 i : ) wstaw 8 4 3 4 6 6 3 5 7 5 7 8 8 ) wstaw 9 ) wstaw 4 4 4 6 6 6 3 5 7 3 5 8 3 5 8 8 7 9 7 9 9

Terez usuńmy dwa elementy. Najpierw 7: 3) usun 7 4 6 3 5 8 7 9 Po usunięciu 7 przemieszczamy się w górę drzewa od usuniętego elementu. Do węzła 8 wróciliśmy z lewej strony, co oznacza, że wagę należy zmniejszyć o jeden (zmiana wag postępuje więc odwrotnie niż po wstawieniu elementu). Po zmianie wagi uzyskaliśmy jedną z wartości ( lub ), które powodują przerwanie wyważania po operacji usuwania. Dalsza zmiana wag (w węzłach 6 i 4) nie ma sensu, co widać też z rysunku. Teraz usuniemy 5: 4) usun 5 4 4 rot. LR 6 8 4 3 5 8 3 6 9 3 8 9 6 9 Ten przypadek jest szczególnie interesujący. Początkowo usuwamy 5 i idziemy w górę zmieniając wagi. W elemencie 6 wagę należy zmniejszyć o (przyszliśmy z prawej strony), co w rezultacie skutkuje wagą i koniecznością rotacji LL w poddrzewie złożonym z elementów 6, 8 i 9. po przeprowadzeniu rotacji kierujemy się dalej w górę i zwiększamy wagę elementu 4 o jeden (powrót z lewej strony). To z kolei powoduje konieczność kolejnej rotacji (LR) przeprowadzonej w korzeniu. Po usunięciu elementu nastąpiła więc konieczność wykonania dwóch rotacji. W pesymistycznym przypadku może wystąpić seria rotacji na kolejnych poziomach drzewa. Taka kaskada rotacji możliwa jest tylko po usunięciu elementu (po dodaniu potrzeba najwyżej jednej). Jednak z racji tego, że jedna rotacja ma koszt stały, a wysokość drzewa VL jest logarytmiczna, to nawet seria rotacji nie zmienia logarytmicznej złożoności operacji usuwania.