ALGORYTMY I STRUKTURY DANYCH WYKŁAD 09 Kopiec Grażyna Mirkowska PJWSTK, 2003/2004
G. Mirkowska, ASD_9 Kopiec Plan wykładu Kopiec (sterta) Definicja Operacja wkładania 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 maj 2003 G. Mirkowska, ASD_9 Kopiec
Kopiec czyli sterta, czyli heap Kopcem nazywamy etykietowane, doskonałe drzewo binarne częściowo uporządkowane. Definicja 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. maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec Przykład kopca 1 7 4 2 3 5 8 9 10 1 5 2 4 3 7 8 9 10 6 Kopiec 1 5 2 4 3 7 8 9 10 Własności: 1. Etykiety na dowolnej drodze od korzenia do liścia tworzą ciąg uporządkowany rosnąco. 2. Element najmniejszy wśród etykiet wierzchołków znajduje się w korzeniu drzewa. To nie jest kopiec , bo nie jest to drzewo doskonałe(chociaż jest to drzewo cz. uporządkowane) To nie jest kopiec , bo nie jest to drzewo częściowo uporządkowane (chociaż jest to drzewo doskonałe) maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec 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. maj 2003 G. Mirkowska, ASD_9 Kopiec
Przykład - dołączanie nowego elementu 1 5 2 4 3 7 8 9 10 6 1 5 2 4 3 7 8 9 10 6 1 2 3 Po dołączeniu nowego wierzchołka Zero „wędruje” wzdłuż drogi do korzenia maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec 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. Algorytm maj 2003 G. Mirkowska, ASD_9 Kopiec
Przykład - usuwanie minimum Usuwamy najmniejszy element zbioru. 12 1 5 1 4 3 10 8 9 7 6 20 12 3 12 12 6 pokaz 12 maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec Koszty operacji h-1 h n - wierzchołków Mamy Wniosek Koszt operacji insert i delmin wynosi O( lg(n+1) ). Stąd 2 h -1 < n 2 h+1 -1 Czyli 2 h < n +1 2 h+1 lg(n+1)-1 h < lg (n+1) Ostatecznie h= lg(n+1) maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec 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 operację insert : O(n lg n) Algorytm Koszt sortowania = koszt utworzenia kopca + n * O(lg n) = O(n lg n) maj 2003 G. Mirkowska, ASD_9 Kopiec
Implementacja kopca w tablicy Reprezentujemy kopiec jako parę Tab + idx tablica etykiet aktualna liczba elementów w tablicy Organizacja 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 maj 2003 G. Mirkowska, ASD_9 Kopiec
G. Mirkowska, ASD_9 Kopiec Przykład 1 5 2 4 3 7 8 9 10 6 Kopiec Reprezentacja tablicowa kopca 1 2 5 4 3 7 8 9 10 6 Tab: n : 10 1 2 3 4 5 6 7 8 9 10 maj 2003 G. Mirkowska, ASD_9 Kopiec
Operacja insert w implementacji tablicowej 5 12 7 10 8 14 19 16 9 11 20 3 5 7 12 10 8 14 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 5 3 Insert(D,3) 5 7 12 10 8 14 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 3 12 3 3 14 Kopiec D 3 7 5 10 8 12 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 14 maj 2003 G. Mirkowska, ASD_9 Kopiec
Delmin w implementacji tablicowej 3 5 7 10 8 12 19 16 9 11 20 14 5 14 3 7 5 10 8 12 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 14 14 12 Delmin(D) 14 14 7 5 10 8 12 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 5 7 12 10 8 14 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: Ostatecznie : maj 2003 G. Mirkowska, ASD_9 Kopiec
Konstrukcja kopca w tablicy Założenie: Znamy z góry liczbę elementów tworzonego kopca. A B i 2i 2i+1 1.Tworzymy tablicę zawierającą wszystkie elementy. 2.Jeżeli są już utworzone kopce A i B o korzeniach w 2itej i 2i+1szej pozycji, to 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. Metoda maj 2003 G. Mirkowska, ASD_9 Kopiec
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; tab[k] := v; end; For i:= n div 2 downto 1 do downheap(i) od; maj 2003 G. Mirkowska, ASD_9 Kopiec
Przykład - konstrukcja kopca 5 1 7 6 2 8 4 3 9 5 7 1 6 2 8 4 3 9 Tab: 1 2 3 4 5 6 7 8 9 To są liście 5 7 1 6 2 8 4 3 9 Tab: 1 2 3 4 5 6 7 8 9 5 7 1 3 2 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 5 2 1 3 7 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 5 7 1 3 2 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 1 2 5 3 7 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 maj 2003 G. Mirkowska, ASD_9 Kopiec
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ć liczba porównań, które trzeba wtedy wykonać Co najwyżej dwa porównania dla każdego elementu na ścieżce do liścia. Tu może przytoczyć dokładny rachunek Gdyby to było pełne drzewo binarne Razem W(n) = O(n) Nie trzeba poprawiać liści Liczba wierzchołków na poziomie h-i maj 2003 G. Mirkowska, ASD_9 Kopiec