Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
11/22/2017
1
1: Zaimplementować kolejkę priorytetową obsługującą liczby integer w dwóch wersjach: • zwykłej tablicy • tablicy uporządkowanej kopcowo.
Czyli: (a) zaprojektować odpowiednie klasy (dwie: jedna na zwyklej tablicy, druga na tablicy uporządkowanej kopcowo) (b) zaimplementować metody klas gwarantujące tworzenie i obsługiwanie tablicy jako kolejki priorytetowej (c) przygotować w main() testy sprawdzające poprawność obsługi obu kolejek priorytetowych 2: Wykorzystać kolejki priorytetowe do implementacji sortowania tablicy dowolnego obiektu typu vector <int> i dowolnej tablicy typu int , czyli HeapSort(vector <int> A) , HeapSort( int * A, int n).
KOLEJKA PRIORYTETOWA kolejka priorytetowa to Abstrakcyjna Struktura Danych zawierająca elementy z kluczami, która pozwala na przeprowadzenie dwóch podstawowych operacji: (1) wstawianie nowego elementu oraz (2) usuwania elementu o największej wartości klucza
23 8 11 5 13 17 2
• Wstaw do kolejki 15 : do ogona kolejki dopisz 15
PQ =
PriorityQueue
23 8 11 5 13 17 15 2
• Obsłuż kolejkę priorytetową : znajdź element największy i usuń go
23 8 11 5 13 17 15 2
8 11 5 13 17 15 2
head: głowa olejki
tail:ogon kolejki
23
11/22/2017
2
C++
void insert (int) ; int get_max () ;
class PriorityQueue { private: public: };
PriorityQueue (); PriorityQueue (int); ~PriorityQueue(); bool empty(); void print();
vector<int> klucze; dane
+ funk-cje je obsłu-gujące
kolejka priorytetowa to Abstrakcyjna Struktura Danych zawierająca elementy z kluczami, która pozwala na przeprowadzenie dwóch podstawowych operacji: (1) wstawianie nowego elementu do kolejki oraz (2) usuwania elementu o największej wartości klucza z kolejki
Kopiec_MAX, to pełne drzewo binarne, gdzie ojciec ≥ syn
KOPIEC MAX
15
12 6
11 8 2 3
1 8
Własności: Wszystkie liście leżą na dwóch sąsiadujących poziomach Liście ostatniego poziomu wypełniają szczelnie jego lewą część dobrze źle 2
2
11/22/2017
3
własność
MaxHeap
Kopiec w
tablicy:
KOPIEC MAX
12 6 11 8 2 3 1 8 15
15
12 6
11 8 2 3
1 8
1 2 3 4 5 6 7 8
1
2 3
4 5 6 7
8 9
9
Pytania: • Jaka jest minimalna i maksymalna liczna elementów w
kopcu o wysokości h? • Pokaż, że kopiec o n elementach jest wysokości lg n. • Czy tablica o wartościach (23,17,14,6,13,10,1,5,7,12) jest
kopcem-max?
• dołącz kolejny element tablicy jako liść do kopca • dopóki ( element > ojciec (element) i element nie jest korzeniem) zamień element z ojcem(element)
fixUP(A, rozmiar) i= rozmiar while ( i>1 and A[parent(i)] < A[i] ) zamien A[parent(i)] z A[i] i= parent(i)
Ćwiczenie: Zbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9}
1. Dołączanie nowej wartości do kopca MAX
KOPIEC MAX
11/22/2017
4
getMax() =
15
12 6
11 8 2 3
1 8
ustaw ostatni liść w root
zmniejsz wymiar kopca
fixDOWN(1)
Naprawiaj
kopiec od góry
do dołu
2. Usuwanie największego elementu z kopca
KOPIEC MAX
getMax() =
15
12 6
11 8 2 3
1
8
ustaw ostatni liść w root
zmniejsz wymiar kopca
fixDOWN(1)
• sprawdzaj konflikt ojca z synami • zamień się kluczem z synem o większym kluczu
Taka operacja nie
zaburza drugiej części
kopca
KOPIEC MAX
11/22/2017
5
12
6 11
8 2 3
1
8
fixDOWN(i) //naprawianie drzewa uporządkowanego kopcowo
dopóki (left ( i ) ≤ rozmiar )
j= left (i)
jeśli konflikt to zamień klucz węzla i z synem o
większym kluczu
i = numer „wykorzystanego” syna
KOPIEC MAX
class PQ_HEAP{
void insert(int); void DrukujKopiec();
private: public: };
vector<int> klucze; void fixUP(int); int left(i); int parent(i); int right();
Kolejka priorytetowa na Kopcu MAX to kolejka priorytetowa , której klucze uporządkowane są kopcowo
int get_max();
C++