Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
ALGORYTMY I STRUKTURY DANYCH
Kopiec
2
Kopiec czyli sterta, czyli heap
Kopcem nazywamy doskonałe drzewo binarne częściowo uporządkowane. Drzewo binarne jest kopcem wtedy i tylko wtedy, gdy: D jest drzewem częściowo uporządkowanym: e(i) < e(i.lewy) i e(i)< e(i.prawy) 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.
3
Przykład kopca Własności:
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)
4
Wstawianie elementu 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.
5
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
6
Usuwanie minimum 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.
7
Przykład - usuwanie minimum
Usuwamy najmniejszy element zbioru. 1 12 5 1 4 3 10 8 9 7 6 20 12 12 3 12 6 12
8
Zastosowanie Algorytm sortujący
1) Z danego n elementowego zbioru utworzyć kopiec. 2) Dopóki kopiec nie jest pusty, wypisywać i usuwać element minimalny kopca.
9
Implementacja kopca w tablicy
Reprezentujemy kopiec jako parę Tab + n 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 n Tab[2i+1] = etykieta prawego syna wierzchołka i-tego o ile 2i+1 n
10
Przykład Reprezentacja tablicowa kopca Kopiec 1 2 5 4 3 7 8 9 10 6
11
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 Tab: 3 5 Insert(D,3) 5 7 12 10 8 14 19 16 9 11 20 Tab: 3 3 12 3 14 Kopiec D 3 7 5 10 8 12 19 16 9 11 20 Tab: 14
12
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.
13
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;
14
Przykładowy program #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int* dane; //wskaznik na inty, to bedzie nasza tablica :) int n; // ilosc intow, ktore dostaniemy cout << "Prosze podac liczbę liczb wejsciowych" << endl; cin >> n; dane = new int[n]; //tworzymy n-elementowa tablice cout << "Prosze podac " << n << " liczb" << endl; for(int i = 0; i < n; i++) //dla kazdego elementu tablicy... cin >> dane[i]; // pobieramy inta vector<int> vec(dane, dane+n); //tworzymy wektor przechowujacy elementy tablicy, tak latwiej bedzie :) make_heap(vec.begin(), vec.end()); //tworzymy kopiec for(vector<int>::iterator i = vec.begin(); i != vec.end(); i++) { cout << *i << ", "; //wypisujemy wszystkie elementy kopca, po kolei } system („pause”); return 0; }
15
Przykład - konstrukcja kopca
5 1 7 6 2 8 4 3 9 5 7 1 6 2 8 4 3 9 Tab: To są liście 5 7 1 6 2 8 4 3 9 Tab: 5 7 1 3 2 8 4 6 9 Tab: 5 2 1 3 7 8 4 6 9 Tab: 5 7 1 3 2 8 4 6 9 Tab: 1 2 5 3 7 8 4 6 9 Tab:
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.