ALGORYTMY I STRUKTURY DANYCH WYKŁAD 10 Kopiec Grażyna Mirkowska PJWSTK, semestr zimowy 2002 Plan wykładu Kopiec (sterta) – – – – Definicja Operacja wkładanie elementu do kopca Usuwanie elementu minimalnego Koszty operacji Zastosowanie - algorytm Heap_sort Implementacja kopca w tablicy – – – Konstrukcja kopca w tablicy Przykład Koszt konstrukcji kopca grudzień 2002 G. Mirkowska, ASD_10 Kopiec 2 Kopiec czyli sterta, czyli heap Kopcem nazywamy etykietowane, doskonałe drzewo binarne częściowo uporządkowane. Etykietowane drzewo binarne D = <V, E, et> jest kopcem wtedy i tylko wtedy, gdy (1) D jest drzewem częściowo uporządkowanym: et(v) < et(v.lewy) i et(v)< et(v.prawy) dla wszystkich wierzchołków v V, (2) D jest drzewem doskonałym: wszystkie poziomy drzewa, z wyjątkiem co najwyżej ostatniego poziomu, są maksymalnie zapełnione, a na ostatnim poziomie wszystkie liście są zgrupowane maksymalnie na lewo. grudzień 2002 G. Mirkowska, ASD_10 Kopiec 3 Przykład kopca 1 2 3 9 3 7 10 10 6 To 9nie jest kopiec , bo nie jest to drzewo Kopiec doskonałe(chociaż jest to drzewo cz. uporządkowane) grudzień 2002 4 5 7 1. Etykiety na dowolnej 8 7 4 Własności: 5 2 4 1 1 8 drodze od korzenia do liścia 2 8 tworzą ciąg3 uporządkowany 5 rosnąco. 2. Element najmniejszy wśród 9 etykiet 10 wierzchołków znajduje się w korzeniu drzewa. To nie jest kopiec , bo nie jest to drzewo częściowo uporządkowane (chociaż jest to drzewo doskonałe) G. Mirkowska, ASD_10 Kopiec 4 Wstawianie elementu Insert : Heap Et Heap Zadanie: Do zbioru etykiet danego kopca D dołączyć nową etykietę e, czyli wykonać operację insert(D,e) (1) Dowiązać nowy wierzchołek x do pierwszego z lewej wierzchołka na przedostatnim poziomie drzewa, którego rząd jest <2. (2) Nadać nowemu wierzchołkowi etykietę e. (3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z etykietą syna, jeśli etykieta ojca jest większa niż etykieta syna. grudzień 2002 G. Mirkowska, ASD_10 Kopiec 5 Przykład - dołączanie nowego elementu 1 01 5 2 4 9 3 10 6 7 8 4 0 Po dołączeniu nowego wierzchołka grudzień 2002 5 012 9 30 2 10 6 7 8 30 Zero „wędruje” wzdłuż drogi do korzenia G. Mirkowska, ASD_10 Kopiec 6 Usuwanie minimum delmin : Heap Heap Niech e będzie etykietą liścia x znajdującego się najbardziej na prawo na ostatnim poziomie kopca. (1) Usunąć wierzchołek x z drzewa d. (2) Zastąpić etykietę w korzeniu drzewa przez e. (3) Jeśli tak otrzymane drzewo nie jest kopcem, to zaczynając od korzenia i idąc w kierunku liścia, zamieniać etykietę ojca z etykietą tego z jego synów, którego etykieta ma mniejszą wartość, tak długo aż zostanie otrzymane drzewo częściowo uporządkowane. grudzień 2002 G. Mirkowska, ASD_10 Kopiec 7 Przykład - usuwanie minimum Usuwamy najmniejszy element zbioru. 12 10 5 13 12 4 12 63 10 8 pokaz 9 grudzień 2002 7 6 12 20 12 G. Mirkowska, ASD_10 pokaz Kopiec 8 Koszt operacji n - wierzchołków Mamy h 1 h-1 i 0 h 2i n 2i i 0 h Stąd 2 h -1 < n 2 h+1 -1 Wniosek Czyli 2 h < n +1 2 h+1 Koszt operacji insert i delmin wynosi O( lg(n+1) ). lg(n+1)-1 h < lg (n+1) Ostatecznie h= lg(n+1) grudzień 2002 G. Mirkowska, ASD_10 Kopiec 9 Zastosowanie Algorytm Heap_sort (1) Z danego n elementowego zbioru utworzyć kopiec. (2) Dopóki kopiec nie jest pusty, wypisywać i usuwać element minimalny kopca. O ile wkładamy kolejno elementy stosując operacje insert : O(n lg n) Koszt sortowania = koszt utworzenia kopca + n * O(lg n) = O(n lg n) grudzień 2002 G. Mirkowska, ASD_10 Kopiec 10 Implementacja kopca w tablicy Reprezentujemy kopiec jako parę Tab + idx tablica etykiet Organizacja elementów w tablicy: aktualna liczba elementów w tablicy Tab[1] = etykieta korzenia Tab[2i] = etykieta lewego syna wierzchołka i-tego o ile 2i idx Tab[2i+1] = etykieta prawego syna wierzchołka i-tego o ile 2i+1 idx grudzień 2002 G. Mirkowska, ASD_10 Kopiec 11 Przykład 1 5 2 4 9 3 10 6 Kopiec grudzień 2002 Reprezentacja tablicowa kopca 8 7 1 2 3 4 5 6 7 8 9 10 Tab: 1 2 5 4 3 7 8 9 10 6 n : 10 G. Mirkowska, ASD_10 Kopiec 12 Operacja insert w implementacji tablicowej 35 1 2 3 4 5 6 7 8 9 10 11 Tab: 12 35 7 5 7 12 10 8 14 19 16 9 11 20 Insert(D,3) 10 8 12 3 14 19 1 2 3 4 5 6 7 8 9 10 11 12 Tab: 16 9 11 20 Kopiec D grudzień 2002 5 7 12 10 8 14 19 16 9 11 20 3 14 3 1 2 3 4 5 6 7 8 9 10 11 12 Tab: 3 7 5 10 8 12 19 16 9 11 20 14 G. Mirkowska, ASD_10 Kopiec 13 Delmin w implementacji tablicowej 35 14 1 2 3 4 5 6 7 8 9 10 11 12 5 12 14 7 10 8 12 14 Tab: 19 3 7 5 10 8 12 19 16 9 11 20 14 Delmin(D) 1 2 3 4 5 6 7 8 9 10 11 16 9 11 20 14 Tab: 14 7 5 10 8 12 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Ostatecznie : grudzień 2002 Tab: 5 7 12 10 8 14 19 16 9 11 20 G. Mirkowska, ASD_10 Kopiec 14 Konstrukcja kopca w tablicy Założenie: Znamy z góry liczbę elementów tworzonego kopca. i 1.Tworzymy tablice zawierającą wszystkie elementy. 2.Jeżeli są już utworzone kopce A i B o korzeniach w 2itej i 2i+1szej pozycji, to 2i A 2i+1 B - albo tab[i] <tab[2i] oraz tab[i]<tab[2i+1] i wtedy mamy już kopiec o korzeniu w i, - albo tak nie jest i wtedy poprawiamy ścieżkę „w dół” tak jak w algorytmie delmin. grudzień 2002 G. Mirkowska, ASD_10 Kopiec 15 Algorytm tworzenia kopca Procedure downheap (k:integer); /* utwórz kopiec o korzeniu w pozycji k zakładając, że 2k i 2k+1 są korzeniami kopców w tablicy*/ begin v := tab[k]; while (k<= n div 2 ) do j := 2*k; if (j<n) then if (tab[j] > tab[j+1] )then j := j+1 fi fi; if v<tab[j] then exit fi; tab[k] := tab[j]; k := j; od; For i:= n div 2 downto 1 do downheap(i) od; tab[k] := v; end; grudzień 2002 G. Mirkowska, ASD_10 Kopiec 16 Przykład - konstrukcja kopca 5 1 3 4 5 6 7 8 9 Tab: 5 7 1 6 2 8 4 3 9 1 7 2 To są liście 6 3 2 1 8 1 9 4 2 3 2 3 4 5 6 7 8 9 Tab: 5 7 1 6 2 8 4 3 9 4 5 6 7 8 9 Tab: 5 7 1 3 2 8 4 6 9 1 2 3 4 5 6 7 8 9 Tab: 5 2 1 3 7 8 4 6 9 1 2 3 4 5 6 7 8 9 Tab: 5 7 1 3 2 8 4 6 9 1 2 3 4 5 6 7 8 9 Tab: 1 2 5 3 7 8 4 6 9 grudzień 2002 G. Mirkowska, ASD_10 Kopiec 17 Koszt konstrukcji kopca Załóżmy, że n jest liczbą elementów w kopcu, a h jego wysokością. W(n) = lw * lp liczba wierzchołków które trzeba być może poprawić h W (n) 2 h i 2i liczba porównań, które trzeba wtedy wykonać i 1 Gdyby to było pełne drzewo binarne grudzień 2002 Razem W(n) = O(n) Nie trzeba poprawiać liści Liczba wierzchołków na poziomie h-i G. Mirkowska, ASD_10 Kopiec Co najwyżej dwa porównania dla każdego elementu na ścieżce do liścia. 18