Κεφάλαιο 2. Η δοµή δεδοµένων Σωρός και η Ταξινόµηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.1, 12/05/2010

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Κεφάλαιο 2. Η δοµή δεδοµένων Σωρός και η Ταξινόµηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.1, 12/05/2010"

Transcript

1 Κεφάλαιο 2 Η δοµή δεδοµένων Σωρός και η Ταξινόµηση Σωρού (The Heap data structure and Heapsort) Έκδοση., 2/05/200 Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

2 Σωρός και Ταξινόµηση Σωρού Στην ενότητα αυτή θα γνωρίσουµε την έννοια της ουράς προτεραιότητας (priority queue) τη δοµή δεδοµένων σωρός (heap), και τον αλγόριθµο ταξινόµησης σωρού (Heapsort)

3 Σε µια ουρά LIFO ή FIFO: ουρές προτεραιότητας (priority queues) Η σειρά εισόδου των στοιχείων στην ουρά καθορίζει και τη σειρά εξόδου. Δεν υπάρχει η έννοια προτεραιότητας για τα στοιχεία: όλα τα στοιχεία αντιµετωπίζονται µε την ίδια προτεραιότητα. Συχνά χρειαζόµαστε δοµές δεδοµένων για την εισαγωγή στοιχείων που το καθένα έχει κάποια προτεραιότητα. Είναι σηµαντικό να µπορούµε να αφαιρούµε το στοιχείο µε τη µεγαλύτερη προτεραιότητα, χωρίς να µας ενδιαφέρει η σειρά µε την οποία έγινε η εισαγωγή κάθε στοιχείου. Μια τέτοια ουρά που λαµβάνει υπόψη την προτεραιότητα κάθε στοιχείου ονοµάζεται ουρά προτεραιότητας. Εφαρµογή: Στη χρονοδροµολόγηση διεργασιών σε ένα λειτουργικό σύστηµα για παράδειγµα µπορεί να έχουµε διεργασίες διαφόρων επιπέδων προτεραιότητας, και να δροµολογούνται πρώτα οι εργασίες µε την υψηλότερη προτεραιότητα. 3

4 ορισµός ουράς προτεραιότητας Η ουρά προτεραιότητας είναι µια δοµή δεδοµένων που: Διατηρεί ένα σύνολο στοιχείων S, όπου κάθε στοιχείο έχει µια συσχετισµένη τιµή key(v) που υποδηλώνει την προτεραιότητα του στοιχείου Υποστηρίζει προσθήκη και διαγραφή στοιχείων Υποστηρίζει την επιλογή του στοιχείου µε το µικρότερο (ή µεγαλύτερο ανάλογα µε την ουρά) κλειδί. 4

5 ουρά προτεραιότητας (priority queue) δοµή δεδοµένων για τη διαχείριση ενός συνόλου στοιχείων S κάθε στοιχείο χαρακτηρίζεται από µία τιµή που ονοµάζεται κλειδί (key) εφαρµογές: χρονοδροµολόγηση εργασιών εξοµοίωση λειτουργίες µιας ουράς προτεραιότητας: Insert(S,x) Minimum(S) ή Maximum(S) ανάλογα µε το είδος του σωρού Extract-Min(S) ή Extract-Max(S) ανάλογα µε το είδος του σωρού Υλοποίηση µε σωρό 5

6 σωρός (heap) 6

7 σωρός (heap) ένα αντικείµενο τύπου συστοιχίας ή πίνακα (array) το οποίο µπορεί να θεωρηθεί ως σχεδόν πλήρες δυαδικό δέντρο κάθε κόµβος του δέντρου αντιστοιχεί σε ένα στοιχείο της συστοιχίας και περιέχει την τιµή αυτού το δέντρο είναι συµπληρωµένο σε όλα τα επίπεδα εκτός ίσως από το τελευταίο το οποίο είναι συµπληρωµένο από τα αριστερά µέχρι κάποιου σηµείου 7

8 ο όρος heap σωρός (heap): δοµή δεδοµένων ο όρος heap χρησιµοποιείται και στο χώρο των λειτουργικών συστηµάτων και των γλωσσών προγραµµατισµού διαφορετικός όρος δεν σχετίζεται µε τη δοµή δεδοµένων heap αναφέρεται στο χώρο δυναµικής δέσµευσης µνήµης 8 ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

9 παράδειγµα σωρού σωρός µε ιδιότητα A[parent(i)] A[i] parent(i) { return i/2 } left(i) { return 2i} right(i) { return 2i+}

10 δυαδικό δέντρο αναδροµικός ορισµός: ένα δυαδικό δέντρο δεν περιλαµβάνει κόµβο, ή έχει τη µορφή: ρίζα αριστερό υποδέντρο δεξί υποδέντρο παραδείγµατα δυαδικών δέντρων: 0

11 πλήρες δυαδικό δέντρο σε πλήρες δυαδικό δέντρο: κάθε κόµβος έχει 2 παιδιά ή κανένα παιδί όλα τα φύλλα έχουν το ίδιο βάθος όλοι οι εσωτερικοί κόµβοι έχουν 2 παιδιά παράδειγµα πλήρους δυαδικού δέντρου:

12 σωρός ελαχίστου ή µεγίστου δύο είδη δυαδικών σωρών: σωροί µεγίστου ιδιότητα: Α[γονέας(i)] A[i] ρίζα: περιέχει το µεγαλύτερο στοιχείο σωροί ελαχίστου ιδιότητα: Α[γονέας(i)] A[i] ρίζα: περιέχει το µικρότερο στοιχείο 2

13 συστοιχία Α για έναν σωρό το αντικείµενο πίνακας Α που αντιπροσωπεύει έναν σωρό περιλαµβάνει τα ακόλουθα δύο πεδία µήκος [Α]: το πλήθος των στοιχείων της συστοιχίας µέγεθος-σωρού[α]: το πλήθος των στοιχείων του σωρού που είναι αποθηκευµένα εντός της συστοιχίας 3

14 βασικές διαδικασίες o αποκατάσταση ιδιότητας ελαχίστου/µεγίστου σωρού o κατασκευή σωρού ελαχίστου/µεγίστου o ταξινόµηση σωρού o διαδικασίες εισαγωγή σε σωρό εξαγωγή κορυφαίου στοιχείου του σωρού µείωση/αύξηση κλειδιού σωρού κορυφαίο στοιχείο σωρού 4

15 2-5 Copyright 2005 Pearson Addison-Wesley. All rights reserved.

16 2-6 Copyright 2005 Pearson Addison-Wesley. All rights reserved.

17 Αλγόριθµος Heapify-up, σελίδα Copyright 2005 Pearson Addison-Wesley. All rights reserved.

18 Copyright 2005 Pearson Addison-Wesley. All rights reserved.

19 αποκατάσταση ιδιότητας σωρού µε Heapify-down δίνεται: πίνακας Α θέση i κάποιου στοιχείου της συστοιχίας τα δυαδικά υπο-δέντρα απόγονοι του κόµβου i είναι σωροί ελαχίστου το A[i] ενδέχεται να παραβιάζει την ιδιότητα σωρού ελαχίστου λύση: αποκατάσταση της ιδιότητας σωρού µε τη µετακύλιση της τιµής Α[i] προς το κατάλληλο υποδέντρο A[i] σωροί 9 ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

20 αύξηση τιµής κλειδιού σε σωρού µεγίστου 20

21 εισαγωγή στοιχείου εισαγωγή στοιχείου στο σωρό. επεκτείνουµε το σωρό κατά θέση 2. στην καινούργια θέση (που βρίσκεται στην τελευταία θέση) τοποθετούµε τη µέγιστη δυνατή τιµή, πχ. συν άπειρο 3. εκτελούµε τη διαδικασία αύξησης της τιµής κλειδιού για το στοιχείο στην τελευταία θέση από τη µέγιστη δυνατή τιµή στην επιθυµητή τιµή: διαδικασία Heap-Decrease-Key(A,i,key) 2 ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

22 κλειδί = 4, HeapInsert(A,κλειδί): A ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

23 αφαίρεση του κορυφαίου στοιχείου του σωρού εισαγωγή του κορυφαίου στοιχείου:. αφαιρούµε το στοιχείο από την κορυφή του σωρού 2. µεταφέρουµε το τελευταίο (κάτω δεξιά) στοιχείο του σωρού στην κορυφή 3. εκτελούµε Heapify-down από την κορυφή για να µετακυλίσουµε το κορυφαίο στοιχείο στην κατάλληλη θέση. 23 ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

24 Αλγόριθµος Heapify-down, σελίδα Copyright 2005 Pearson Addison-Wesley. All rights reserved.

25 δηµιουργία σωρού Εάν έχουµε έναν πίνακα µε n στοιχεία (χωρίς ταξινόµηση) µπορούµε να σχηµατίσουµε µία σωρό µε την ακόλουθη διαδικασία: Σαρώνουµε όλους τους κόµβους του σωρού, εκτός από τα φύλλα, από δεξιά προς τα αριστερά και από κάτω προς τα επάνω, και κάθε κόµβο εκτελούµε Heapify-down. Παράδειγµα: Στον παρακάτω σωρό εκτελούµε Heapify-down διαδοχικά για τους κόµβους 5, 4, 3, 2 και i A

26 κατασκευή σωρού βασικές ιδέες: χρησιµοποιούµε τη µέθοδο αποκατάστασης σωρού προχωράµε µε λογική bottom-up (αναβιβαστικά) 26 ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

27 παράδειγµα κατασκευής σωρού A α) β) 4 4 Heapify(A,5): Heapify(A,4): i i γ) Heapify(A,3): i ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

28 παράδειγµα κατασκευής σωρού δ-) Heapify(A,2): δ-2) Heapify(A,4): i ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

29 ε-) Heapify(A,): 4 ε-2) Heapify(A,2): ε-3) Heapify(A,9): ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

30 θ) A ταξινόµηση σωρού Δοµές Δεδοµένων και Αλγόριθµοι

31 πολυπλοκότητα δηµιουργίας σωρού η διαίσθηση: O(n lg n) h = k k- 0 κάθε κλήση της Heapify στοιχίζει Θ(lg n) γίνονται O(n) κλήσεις εποµένως, η δηµιουργία του σωρού στοιχίζει O(n lg n) lgn = k πιο σφιχτή (tighter) ανάλυση: O(n) θεωρούµε n = 2 k - και πλήρες δυαδικό δέντρο ο χρόνος που απαιτεί η Heapify όταν εκτελείται για έναν κόµβο ύψους h είναι O(h) συνολικό κόστος = lg n h= 0 n 2 lg n h O ( h ) O ( n ) O ( n ) = h h= 0 2 = h + χρησιµοποιώντας (χωρίς απόδειξη) ότι: = h 0 h h 2 = 2 3 Δοµές Δεδοµένων και Αλγόριθµοι

32 Αλγόριθµος, Άσκηση 6, σελίδα Copyright 2005 Pearson Addison-Wesley. All rights reserved.

33 Ταξινόµηση Σωρού (Heapsort) 33

34 ταξινόµηση σωρού Έστω ότι έχουµε υλοποιηµένη µια δοµή δεδοµένων σωρός. Πως µπορούµε να τη χρησιµοποιήσουµε για να ταξινοµήσουµε µία ακολουθία στοιχείων; Αλγόριθµος Heapsort: Δίνεται πίνακας µε n στοιχεία Κατασκευάζουµε έναν σωρό µέσα στον πίνακα Α σε χρόνο O(n) Εκτελούµε n- φορές: o Αφαιρούµε το κορυφαίο στοιχείο του σωρού και το τοποθετούµε στην τελευταία θέση του σωρού. Το στοιχείο που βρισκόταν στην τελευταία θέση του σωρού το τοποθετούµε στην κορυφή του σωρού. o Μειώνουµε κατά ένα το µέγεθος του σωρού (ελεθερώνοντας έτσι µία θέση στον πίνακα) o Εκτελούµε Heapify-down στην κορυφή του σωρού Ο βρόχος εκτελείται n- φορές και κάθε εκτέλεση γίνεται σε χρόνο O(log n): Εποµένως η φάση αυτή του αλγορίθµου απαιτεί χρόνο O(n logn). Σύνολο: O(n) + O(n log n) = O (n logn) 34

35 ταξινόµηση σωρού άλλος ένας αλγόριθµος ταξινόµησης πολυπλοκότητα: O(n lοg(n)) Ιδιαίτερα χαρακτηριστικά: χρησιµοποιεί τη δοµή δεδοµένων «σωρός» είναι επιτόπια: το πλήθος των στοιχείων της συστοιχίας εισόδου που είναι αποθηκευµένα εκτός της συστοιχίας αυτής ανά πάσα στιγµή δεν υπερβαίνει µια σταθερή ποσότητα είναι stable, δηλαδή στοιχεία που έχουν την ίδια τιµή στο κλειδί διατηρούν µετά την ταξινόµηση την ίδια µεταξύ τους διάταξη που είχαν πριν την ταξινόµηση 35

36 πηγές/αναφορές Κεφάλαιο 2, Σχεδίαση Αλγορίθµων, J. Kleinberg and E. Tardos, Ελληνική έκδοση από τις Εκδ. Κλειδάριθµος Κεφάλαιο 6, Εισαγωγή στους αλγόριθµους, T. Cormen, C. Leiserson, R. Rivest and C. Stein, Ελληνική έκδοση από τις Πανεπιστηµιακές Εκδ. Κρήτης 36