5
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

Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

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

Page 2: Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

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

Page 3: Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

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

Page 4: Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

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

Page 5: Slajd 1 - University of GdańskZbuduj kopiec dla liczb A= {5, 3, 17, 10, 84, 19, 6, 22, 9} . Dołączanie nowej wartości do kopca MAX KOPIEC MAX 11/22/2017 4 getMax() = 15 12 6 11

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++