PODSTAWY INFORMATYKI WYKŁAD 8. prowadzący dr ADRIAN HORZYK http://home home.agh.edu.pl/~ /~horzyk e-mail: horzyk@agh agh.edu.pl tel.: 012-617 617-4319 Konsultacje paw. D-13/325
DRZEWA Drzewa to rodzaj struktury danych, w której możemy wyróżnić: korzeń (wierzchołek główny) wierzchołki wewnętrzne posiadają swoje poprzedniki (przodków) i następniki (potomków) liście Las to kilka drzew powiązanych razem poziom 1 poziom 2 długość drogi do węzła x poziom 3 poziom 4 = głębokość wysokość
DRZEWA BINARNE Drzewa binarne to taki rodzaj drzew, w których każdy węzeł posiada dwa następniki (dwóch potomków): Wskaźnik KORZEŃ Wsk 1.Wsk Wsk.. 2 1. Wsk 3.Wsk 4. 2. Wsk 5.Wsk 6. 3. 4. Wsk 7.Wsk 8. 5. 6. 7. 8. Implementacja drzewa binarnego przy pomocy tablicy: KORZ. 1. 2. 3. 4. 5. 6. za za za za za za za puste puste 7. 8. za za puste puste
DRZEWA ARYTMETYCZNE Drzewa możemy wykorzystać np. do zapisu operacji matematycznych, tj. +, -, *, / itp. W takich drzewach operacje matematyczne umieszczone są w węzłach drzewa, zaś atrybuty (parametry) w liściach. Drzewa arytmetyczne odwzorowują również w naturalny sposób kolejność wykonywania działań.
PRZESZUKIWANIE DRZEW Drzewa można przeszukiwać na różne sposoby. Można wyróżnić 2 klasyczne algorytmy: BFS breadth first search przeszukiwanie w szerz DFS depth first search przeszukiwanie w głąb Efektywność poszczególnych sposobów przeszukiwania drzew jest zależna od rozwiązywanego problemu. 1 BFS 1 DFS 2 3 4 5 6 2 6 7 11 12 7 8 9 10 11 12 13 3 5 8 9 13 17 18 14 15 16 17 18 19 4 10 14 15 16 19
DRZEWO POSZUKIWAŃ Z WARTOWNIKIEM Jako ostatni węzeł (liść) drzewa ustawiamy zawsze liść, którego pełni rolę wartownika w drzewie. Wskaźnik KORZEŃ Wsk 1.Wsk Wsk.. 2 1. Wsk 3.Wsk 4. 2. Wsk 5.Wsk 6. 3. 4. Wsk 7.Wsk 8. 5. 6. 7. 8. wartownik
DRZEWA DECYZYJNE Każdy węzeł w drzewie decyzyjnym ma etykietę a i : a j dla pewnych i oraz j z przedziału 1 i, j n, gdzie n jest liczbą elementów w ciągu wejściowym. Z każdym liściem związana jest jedna permutacja π(1), π(2),..., π(n). Wykonanie algorytmu sortującego odpowiada przejściu ścieżki od korzenia drzewa decyzyjnego do jednego z jego liści, tj. znalezieniu poprawnej permutacji elementów ciągu. W każdym węźle wewnętrznym zostaje wykonane porównanie typu a i a j. W lewym poddrzewie znajdują się porównania wykonywane przez algorytm, jeśli okaże się, że a i a j, a prawe poddrzewo zawiera możliwe scenariusze dla przeciwnego przypadku, tj. a i > a j. Jeśli algorytm sortujący działa poprawnie, to każda z n! permutacji musi wystąpić jako jeden z liści drzewa decyzyjnego. Długość najdłuższej ścieżki od korzenia drzewa decyzyjnego do dowolnego z jego liści odpowiada pesymistycznej liczbie porównań wykonywanych przez algorytm sortujący. Wszystkie algorytmy sortowania za pomocą porównań można prezentować w postaci drzew decyzyjnych! Każde drzewo decyzyjne, odpowiadające algorytmowi poprawnie sortującemu n elementów, ma wysokość Ω(n lg n).
KOPIEC Kopiec drzewo binarne, w węzłach którego znajdują się elementy reprezentowanego multizbioru S i jest spełniony tzw. warunek kopca, mianowicie: Jeśli węzeł x jest następnikiem węzła y, to element w węźle x jest nie większy niż element w węźle y. Jeśli spełniony jest warunek kopca mówimy, że drzewo ma uporządkowanie kopcowe, a jego elementy zachowują porządek kopcowy. Uporządkowanie kopcowe zapewnia: w korzeniu drzewa znajduje się największy element (lub jeden z największych, gdy jest ich kilka) na ścieżkach w drzewie, od korzenia do liścia, elementy są uporządkowane w porządku nierosnącym.
KOPIEC ZUPEŁNY Kopiec zupełny to kopiec i zarazem zupełne drzewo binarne, czyli takie, w którym wszystkie poziomy są wypełnione całkowicie z wyjątkiem co najwyżej ostatniego, który jest spójnie wypełniony od strony lewej:
KOPIEC ZUPEŁNY Ze względu na regularną strukturę kopca zupełnego, można go reprezentować w prosty sposób w tablicy: Następniki węzła k (o ile istnieją) mają odpowiednio numery 2k i 2k+1, zaś poprzednik węzła k (różny od korzenia) ma numer k/2 :
OPERACJE NA KOPCU ZUPEŁNYM Wstawianie elementu (operacja Wstaw(x, S)) do kopca zupełnego: Usuwanie elementu maksymalnego (operacja UsuńMax(S)) z kopca zupełnego:
OPERACJE NA KOPCU ZUPEŁNYM procedure insert (v : integer); + 1. begin n :=n+1; a[n] := v; upheap (n) end {insert}; // Pesymistyczna złożoność czasowa log n procedura upheap (k : integer); var 1, v : integer; begin v :=a[k]; a[0) : + ; l:= k div 2; {warunek kopca jest zaburzony co najwyżej tylko dla v} while a[l] < v do begin {węzeł l jest poprzednikiem węzła k} a[k] := a[l]; k:=l; l :=l div 2 end; a[k] := v end {upheap};
OPERACJE NA KOPCU ZUPEŁNYM procedure deletemax : integer; // Pesymistyczna złożoność czasowa 2 log n. begin deletemax := a[1]; a[1] := a[n]; n := n 1; downheap(1) end {deletemax}; procedure downheap(k : integer); label 0; var i, j, v : integer; begin v := a[k]; while k n div 2 do begin j := 2 * k; {j jest następnikiem k} if j < n then if a[j] < a[j + 1] then j := j + 1; if v a[j] then goto 0; a[k] := a[j]; k := j end; 0: a[k] := v end {downheap};
OPERACJE NA KOPCU ZUPEŁNYM procedure construct; // Pesymistyczna złożoność czasowa O(n). {Elementy listy q=[a 1,...,a n ] znajdują się w tablicy a[1..n] } var i : integer; begin for i := n div 2 downto 1 do downheap(i) end {construct}; procedure heapsort; // Pesymistyczna złożoność czasowa 2 n log n + O(n) = O(n log n). { Tablica a[1..n] zawiera elementy do posortowania } var m, i : integer; begin m := n; construct; for i := m downto 2 do a[i] := deletemax; n := m end {heapsort};
SORTOWANIE KOPCOWE - HEAPSORT Algorytm sortowania kopcowego daje się zapisać za pomocą operacji kolejki priorytetowej następująco: Buduj(q, S); O(n) Powtórz n-1 razy UsuńMax(S); (n-1)*o(log n) = O(n log n) dla danej listy q=[a 1,...,a n ] charakteryzujący się pesymistyczną złożonością czasową O(n log n).
KOLEJKI PRIORYTETOWE Kolejki priorytetowe struktura danych, która realizuje następujące operacje: Buduj(q, S) - utworzenie multizbioru S={a 1,...,a n } dla danej listy q=[a 1,...,a n ], Wstaw(x, S) - S := S {x}, UsuńMax(S) - usunięcie największego elementu z S. W porównaniu do zwykłej kolejki (FIFO) z kolejki priorytetowej usuwany jest zawsze maksymalny element (czyli element o najwyższym priorytecie).
POLECANA LITERATURA DO WYKŁADU L. Banachowski, K. Diks, W. Rytter: Algorytmy i struktury danych, WNT, Warszawa, 2001 M. Sysło: Elementy Informatyki A.Szepietowski: Podstawy Informatyki R. Tadeusiewicz, P. Moszner, A. Szydełko: Teoretyczne podstawy informatyki W. M. Turski: Propedeutyka informatyki N. Wirth: Wstęp do programowania systematycznego N. Wirth: ALGORYTMY + STRUKTURY DANYCH = PROGRAMY