asd10

advertisement
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
Download