Κεφάλαιο 2 Η δομή δεδομένων Σωρός και η Ταξινόμηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.3, 14/11/2014 Χρησιμοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne. 1
Σωρός και Ταξινόμηση Σωρού Στην ενότητα αυτή θα γνωρίσουμε την έννοια της ουράς προτεραιότητας (priority queue) τη δομή δεδομένων σωρός (heap), και τον αλγόριθμο ταξινόμησης σωρού (Heapsort)
Σε μια ουρά LIFO ή FIFO: ουρές προτεραιότητας (priority queues) Η σειρά εισόδου των στοιχείων στην ουρά καθορίζει και τη σειρά εξόδου. Δεν υπάρχει η έννοια προτεραιότητας για τα στοιχεία: όλα τα στοιχεία αντιμετωπίζονται με την ίδια προτεραιότητα. Ουρές για στοιχεία με προτεραιότητες: Συχνά χρειαζόμαστε δομές δεδομένων για την εισαγωγή στοιχείων που το καθένα έχει κάποια προτεραιότητα. Είναι σημαντικό να μπορούμε να αφαιρούμε το στοιχείο με τη μεγαλύτερη προτεραιότητα, χωρίς να μας ενδιαφέρει η σειρά με την οποία έγινε η εισαγωγή κάθε στοιχείου. Μια τέτοια ουρά που λαμβάνει υπόψη την προτεραιότητα κάθε στοιχείου ονομάζεται ουρά προτεραιότητας. Εφαρμογή: Στη χρονοδρομολόγηση διεργασιών σε ένα λειτουργικό σύστημα για παράδειγμα μπορεί να έχουμε διεργασίες διαφόρων επιπέδων προτεραιότητας, και να δρομολογούνται πρώτα οι εργασίες με την υψηλότερη προτεραιότητα. 3
ορισμός ουράς προτεραιότητας Η ουρά προτεραιότητας είναι μια δομή δεδομένων που: Διατηρεί ένα σύνολο στοιχείων S, όπου κάθε στοιχείο έχει μια συσχετισμένη τιμή key(v) που υποδηλώνει την προτεραιότητα του στοιχείου Υποστηρίζει προσθήκη και διαγραφή στοιχείων Υποστηρίζει την επιλογή του στοιχείου με το μικρότερο (ή μεγαλύτερο ανάλογα με την ουρά) κλειδί. 4
σωρός (heap) 5
σωρός (heap) ένα αντικείμενο τύπου συστοιχίας ή πίνακα (array) το οποίο μπορεί να θεωρηθεί ως σχεδόν πλήρες δυαδικό δέντρο κάθε κόμβος του δέντρου αντιστοιχεί σε ένα στοιχείο της συστοιχίας και περιέχει την τιμή αυτού το δέντρο είναι συμπληρωμένο σε όλα τα επίπεδα εκτός ίσως από το τελευταίο το οποίο είναι συμπληρωμένο από τα αριστερά μέχρι κάποιου σημείου 6
Διευκρίνιση για τον όρο heap Heap (data structures): η δομή δεδομένων heap (σωρός) Heap (memory management): στο χώρο των λειτουργικών συστημάτων ο όρος heap είναι διαφορετικός όρος, αναφέρεται στο χώρο δυναμικής δέσμευσης μνήμης και δεν σχετίζεται με τη δομή δεδομένων heap Για παράδειγμα: http://en.wikipedia.org/wiki/heap_(data_structure) http://en.wikipedia.org/wiki/memory_management 7 ταξινόμηση σωρού Δομές Δεδομένων
2-8 ταξινόμηση σωρού
παράδειγμα σωρού σωρός με ιδιότητα A[parent(i)] A[i] 1 1 2 3 3 12 parent(i) { return i/2 } left(i) { return 2i} right(i) { return 2i+1} 4 5 6 7 4 9 17 28 8 9 10 10 14 16 1 2 3 4 5 6 7 8 9 10 1 3 12 4 9 17 28 10 14 16 9
σωρός ελαχίστου ή μεγίστου δύο είδη δυαδικών σωρών: σωροί μεγίστου ιδιότητα: Α[γονέας(i)] A[i] ρίζα: περιέχει το μεγαλύτερο στοιχείο σωροί ελαχίστου ιδιότητα: Α[γονέας(i)] A[i] ρίζα: περιέχει το μικρότερο στοιχείο 10
συστοιχία Α για έναν σωρό το αντικείμενο πίνακας Α που αντιπροσωπεύει έναν σωρό περιλαμβάνει τα ακόλουθα δύο πεδία μήκος [Α]: το πλήθος των στοιχείων της συστοιχίας μέγεθος-σωρού[α]: το πλήθος των στοιχείων του σωρού που είναι αποθηκευμένα εντός της συστοιχίας 11
Εισαγωγή Στοιχείου 12
2-13 ταξινόμηση σωρού
Αλγόριθμος Heapify-up 2-14 ταξινόμηση σωρού
Αφαίρεση Κορυφαίου Στοιχείου 15
ταξινόμηση σωρού 16
Αλγόριθμος Heapify-down 2-17 ταξινόμηση σωρού
ουρά προτεραιότητας (priority queue) δομή δεδομένων για τη διαχείριση ενός συνόλου στοιχείων H κάθε στοιχείο χαρακτηρίζεται από μία τιμή που ονομάζεται κλειδί (key) εφαρμογές: χρονοδρομολόγηση εργασιών εξομοίωση λειτουργίες μιας ουράς προτεραιότητας: StartHeap(H) Insert(H,x) FindMin(H) ή FindMax(H) ανάλογα με το είδος του σωρού Delete(H,x) ExtractMin(H) ή ExtractMax(H) ανάλογα με το είδος του σωρού Υλοποίηση με σωρό 18
Δημιουργία Σωρού σε Μη Κενό Πίνακα 19
δημιουργία σωρού Εάν έχουμε έναν πίνακα με n στοιχεία (χωρίς ταξινόμηση) μπορούμε να σχηματίσουμε μία σωρό με την ακόλουθη διαδικασία: Σαρώνουμε όλους τους κόμβους του σωρού, εκτός από τα φύλλα, από δεξιά προς τα αριστερά και από κάτω προς τα επάνω, και κάθε κόμβο εκτελούμε Heapify-down. Παράδειγμα: Στην παρακάτω σωρό εκτελούμε Heapify-down διαδοχικά για τους κόμβους 5, 4, 3, 2 και 1. 14 1 2 3 8 10 4 5 6 7 2 16 i 9 3 8 9 10 4 1 7 A 1 2 3 4 5 6 7 8 9 10 14 8 10 2 16 9 3 4 1 7 20
κατασκευή σωρού βασικές ιδέες: χρησιμοποιούμε τη μέθοδο αποκατάστασης σωρού προχωράμε με λογική bottom-up (από τα κάτω επίπεδα προς τα επάνω) 21 ταξινόμηση σωρού Δομές Δεδομένων
παράδειγμα κατασκευής σωρού A 1 2 3 4 5 6 7 8 9 10 14 8 10 2 16 9 3 4 1 7 α) β) 14 1 14 1 Heapify(A,5): Heapify(A,4): 2 3 2 3 8 10 8 10 4 5 6 7 2 16 i 9 3 4 5 6 7 2 i 7 9 3 8 9 10 4 1 7 14 1 γ) 2 3 Heapify(A,3): 8 10 i 4 5 6 7 1 7 9 3 8 9 10 4 2 16 8 9 10 4 1 16 1 22 ταξινόμηση σωρού Δομές Δεδομένων
παράδειγμα κατασκευής σωρού δ-1) Heapify(A,2): δ-2) Heapify(A,4): 14 14 1 2 3 8 i 3 4 5 6 7 1 7 9 10 2 3 1 3 4 5 6 7 8 7 9 10 8 9 10 4 2 16 8 9 10 4 2 16 1 23 ταξινόμηση σωρού Δομές Δεδομένων
ε-1) Heapify(A,1): 1 14 ε-2) Heapify(A,2): 1 1 2 3 1 3 2 3 14 3 4 5 6 7 2 7 9 10 8 9 10 4 8 16 4 5 6 7 2 7 9 10 8 9 10 4 8 16 1 1 ε-3) 2 3 2 3 Heapify(A,9): 4 5 6 7 14 7 9 10 8 9 10 4 8 16 24 ταξινόμηση σωρού Δομές Δεδομένων
θ) 1 1 2 3 2 3 4 5 6 7 4 7 9 10 8 9 10 14 8 16 A 1 2 3 4 5 6 7 8 9 10 1 2 3 4 7 9 10 14 8 16 25 ταξινόμηση σωρού Δομές Δεδομένων
πολυπλοκότητα δημιουργίας σωρού η διαίσθηση: O(n lg n) h = k k-1 1 0 κάθε κλήση της Heapify στοιχίζει Θ(lg n) γίνονται O(n) κλήσεις επομένως, η δημιουργία του σωρού στοιχίζει O(n lg n) lg n k πιο σφιχτή (tighter) ανάλυση: O(n) θεωρούμε n = 2 k -1 και πλήρες δυαδικό δέντρο ο χρόνος που απαιτεί η Heapify όταν εκτελείται για έναν κόμβο ύψους h είναι O(h) συνολικό κόστος = n h O( h) O( n ) O( n) h 1 h 2 h 0 2 lgn lgn h 0 χρησιμοποιώντας (χωρίς απόδειξη) ότι: h 0 h h 2 2 26 Δομές Δεδομένων
Δυαδικά Δέντρα 27
δυαδικό δέντρο αναδρομικός ορισμός: ένα δυαδικό δέντρο δεν περιλαμβάνει κόμβο, ή έχει τη μορφή: ρίζα αριστερό υποδέντρο δεξί υποδέντρο παραδείγματα δυαδικών δέντρων: 28
πλήρες δυαδικό δέντρο σε πλήρες δυαδικό δέντρο: κάθε κόμβος έχει 2 παιδιά ή κανένα παιδί όλα τα φύλλα έχουν το ίδιο βάθος όλοι οι εσωτερικοί κόμβοι έχουν 2 παιδιά παράδειγμα πλήρους δυαδικού δέντρου: 29
Ταξινόμηση Σωρού (Heapsort) 30
ταξινόμηση σωρού Έστω ότι έχουμε υλοποιημένη τη δομή δεδομένων σωρός. Πως μπορούμε να τη χρησιμοποιήσουμε για να ταξινομήσουμε μία ακολουθία στοιχείων; 31
ταξινόμηση σωρού Αλγόριθμος Heapsort: Δίνεται πίνακας με n στοιχεία Κατασκευάζουμε έναν σωρό μέσα στον πίνακα Α σε χρόνο O(n) Εκτελούμε n-1 φορές: o Αφαιρούμε το κορυφαίο στοιχείο του σωρού και το τοποθετούμε στην τελευταία θέση του σωρού. Το στοιχείο που βρισκόταν στην τελευταία θέση του σωρού το τοποθετούμε στην κορυφή του σωρού. o Μειώνουμε κατά ένα το μέγεθος του σωρού (ελεθερώνοντας έτσι μία θέση στον πίνακα) o Εκτελούμε Heapify-down στην κορυφή του σωρού 32
ταξινόμηση σωρού Αλγόριθμος Heapsort: Δίνεται πίνακας με n στοιχεία Κατασκευάζουμε έναν σωρό μέσα στον πίνακα Α σε χρόνο O(n) Εκτελούμε n-1 φορές: o Αφαιρούμε το κορυφαίο στοιχείο του σωρού και το τοποθετούμε στην τελευταία θέση του σωρού. Το στοιχείο που βρισκόταν στην τελευταία θέση του σωρού το τοποθετούμε στην κορυφή του σωρού. o Μειώνουμε κατά ένα το μέγεθος του σωρού (ελεθερώνοντας έτσι μία θέση στον πίνακα) o Εκτελούμε Heapify-down στην κορυφή του σωρού Ο βρόχος εκτελείται n-1 φορές και κάθε εκτέλεση γίνεται σε χρόνο O(log n): Επομένως η φάση αυτή του αλγορίθμου απαιτεί χρόνο O(n logn). Σύνολο: O(n) + O(n log n) = O (n logn) 33
ταξινόμηση σωρού άλλος ένας αλγόριθμος ταξινόμησης πολυπλοκότητας O(n lοg(n)) Ιδιαίτερα χαρακτηριστικά: χρησιμοποιεί τη δομή δεδομένων σωρός είναι in place (επιτόπια): το πλήθος των στοιχείων της συστοιχίας εισόδου που είναι αποθηκευμένα εκτός της συστοιχίας αυτής ανά πάσα στιγμή δεν υπερβαίνει μια σταθερή ποσότητα είναι stable, δηλαδή στοιχεία που έχουν την ίδια τιμή στο κλειδί διατηρούν μετά την ταξινόμηση την ίδια μεταξύ τους διάταξη που είχαν πριν την ταξινόμηση 34
πηγές/αναφορές Κεφάλαιο 2, Σχεδίαση Αλγορίθμων, J. Kleinberg and E. Tardos, Ελληνική έκδοση από τις Εκδ. Κλειδάριθμος Κεφάλαιο 6, Εισαγωγή στους αλγόριθμους, T. Cormen, C. Leiserson, R. Rivest and C. Stein, Ελληνική έκδοση από τις Πανεπιστημιακές Εκδ. Κρήτης 35