ταξινόμηση σωρού Παύλος Εφραιμίδης ταξινόμηση σωρού
ταξινόμηση σωρού άλλος ένας αλγόριθμος ταξινόμησης πολυπλοκότητας O(n lgn) Ιδιαίτερα χαρακτηριστικά: χρησιμοποιεί μια δομή δεδομένων που ονομάζεται «σωρός» είναι επιτόπια: το πλήθος των στοιχείων της συστοιχίας εισόδου που είναι αποθηκευμένα εκτός της συστοιχίας αυτής ανά πάσα στιγμή δεν υπερβαίνει μια σταθερή ποσότητα ταξινόμηση σωρού
σωρός (heap) ένα αντικείμενο τύπου συστοιχίας ή πίνακα (array) το οποίο μπορεί να θεωρηθεί ως σχεδόν πλήρες δυαδικό δέντρο κάθε κόμβος του δέντρου αντιστοιχεί σε ένα στοιχείο τηςσυστοιχίαςκαιπεριέχειτηντιμήαυτού το δέντρο είναι συμπληρωμένο σε όλα τα επίπεδα εκτός ίσως από το τελευταίο το οποίο είναι συμπληρωμένο από τα αριστερά μέχρι κάποιου σημείου ταξινόμηση σωρού
οόροςheap σωρός (heap): δομή δεδομένων heap στο χώρο των λειτουργικών συστημάτων και των γλωσσών προγραμματισμού διαφορετικός όρος δεν σχετίζεται με τη δομή δεδομένων heap αναφέρεται στο χώρο δυναμικής δέσμευσης μνήμης 4 ταξινόμηση σωρού
συστοιχία Α για έναν σωρό το αντικείμενο συστοιχία Α που αντιπροσωπεύει έναν σωρό περιλαμβάνει τα ακόλουθα δύο πεδία μήκος [Α]: το πλήθος των στοιχείων της συστοιχίας μέγεθος-σωρού[α]: το πλήθος των στοιχείων του σωρού που είναι αποθηκευμένα εντός της συστοιχίας 5 ταξινόμηση σωρού
σωροί μια δομή δεδομένων που είναι ένα σχεδόν πλήρες δυαδικό δέντρο ικανοποιεί την ιδιότητα σωρού: A[parent(i)] A[i] πχ. 6 4 0 4 5 6 8 9 8 9 0 4 4 5 6 8 9 0 6 4 0 8 9 4 i Parent(i) { return } Left(i) { return i} Right(i) { return i+} ταξινόμηση σωρού 6
δυαδικό δέντρο δεν περιλαμβάνει κόμβο, ή ρίζα πχ. αριστερό υποδέντρο φύλλο: κόμβος χωρίς απογόνους σε πλήρες δυαδικό δέντρο: κάθε κόμβος έχει παιδιά ή κανένα παιδί όλα τα φύλλα έχουν το ίδιο βάθος όλοι οι εσωτερικοί κόμβοι έχουν παιδιά δεξί υποδέντρο ταξινόμηση σωρού
ελαχίστου ή μεγίστου δύοείδηδυαδικώνσωρών: σωροί μεγίστου ιδιότητα: Α[ΠΑΤΡΙΚΟΣ(i)] A[i] ρίζα: περιέχει το μεγαλύτερο στοιχείο σωροί ελαχίστου ιδιότητα: Α[ΠΑΤΡΙΚΟΣ(i)] A[i] ρίζα: περιέχει το μικρότερο στοιχείο ταξινόμηση σωρού 8
βασικές διαδικασίες αποκατάσταση ιδιότητας μεγίστου σωρού κατασκευή σωρού μεγίστου ταξινόμηση σωρού διαδικασίες εισαγωγή σε σωρό μεγίστου εξαγωγή μεγίστου σωρού αύξηση κλειδιού σωρού μέγιστο σωρού ταξινόμηση σωρού 9
διατήρηση της ιδιότητας σωρού συνθήκη: το A[i] μπορεί να έχει πάρει τιμή μικρότερη από (κάποιο από) τα παιδιά του A[i] σωροί ταξινόμηση σωρού 0
αποκατάσταση ιδιότητας σωρού δίνεται: συστοιχία Α θέση i κάποιου στοιχείου της συστοιχίας τα δυαδικά υπο-δέντρα απόγονοι του κόμβου i είναι σωροί μεγίστου το A[i] ενδέχεται να παραβιάζει την ιδιότητα σωρού μεγίστου λύση: γίνετε μετακύλιση της τιμής Α[i] προς το κατάλληλο υποδέντρο ταξινόμηση σωρού
Heapify(A,): 6 4 0 4 4 5 6 9 8 9 8 0 Heapify(A,4): 6 4 0 4 4 5 6 9 8 9 8 0 Heapify(A,9): 6 4 0 4 5 6 8 9 8 9 0 4 ταξινόμηση σωρού
ψευδοκώδικας Heapify(A,i) χρόνος: O(lg n), T(n) T(n/)+Θ() ταξινόμηση σωρού
κατασκευή σωρού βασικές ιδέες: χρησιμοποιούμε τη μέθοδο αποκατάστασης σωρού προχωράμεμελογικήbottom-up (αναβιβαστικά) ταξινόμηση σωρού 4
παράδειγμα κατασκευής σωρού A 4 5 6 8 9 0 4 6 9 0 4 8 4 4 4 5 6 i 6 9 0 4 i 5 6 6 9 0 8 9 0 8 9 0 4 8 4 8 4 4 i 0 i 4 5 6 4 5 6 4 6 9 0 4 6 9 8 9 0 8 8 9 0 8 ταξινόμηση σωρού 5
4 i 6 6 0 4 4 5 6 9 8 9 8 0 4 0 4 8 5 6 9 8 9 4 0 ταξινόμηση σωρού 6
ανάλυση h = k k- 0 lgn = k η διαίσθηση: O(nlgn) κάθε κλήση της Heapify στοιχίζει Θ(lg n) γίνονται O(n) κλήσεις επομένως, η δημιουργία του σωρού στοιχίζει O(nlgn) πιο σφιχτή (tighter) ανάλυση: O(n) θεωρούμε n = k - και πλήρες δυαδικό δέντρο ο χρόνος που απαιτεί η Heapify όταν εκτελείται για έναν κόμβο ύψους h είναι O(h) συνολικό κόστος = lg n lg n n h O ( h ) = O ( n ) = O ( n ) h + h h 0 = h = 0 h χρησιμοποιώντας (άσκηση) ότι: = h = h 0 ταξινόμηση σωρού
ταξινόμηση σωρού Έστω ότι έχουμε υλοποιημένη μια δομή δεδομένων σωρός. Πως μπορούμε να τη χρησιμοποιήσουμε για να ταξινομήσουμε μία ακολουθία στοιχείων; ταξινόμηση σωρού 8
αλγόριθμος heapsort ----O(n) ----O(lg n) πολυπλοκότητα χρόνου = O(n lg n) ταξινόμηση σωρού 9
ουρές προτεραιότητας ταξινόμηση σωρού 0
ουρά προτεραιότητας (priority queue) μιαδομήδεδομένωνγιατηδιαχείρισηενός συνόλου στοιχείων S κάθε στοιχείο στοιχείο χαρακτηρίζεται από μία τιμή που ονομάζεται κλειδί (key) εφαρμογή: χρονοδρομολόγηση εργασιών εξομοίωση λειτουργίες μιας ουράς προτεραιότητας: Insert(S,x) Maximum(S) Extract-Max(S) Implement with a heap. ταξινόμηση σωρού
εισαγωγή στοιχείου εισαγωγή στοιχείου στο σωρό. επεκτείνουμε το σωρό κατά θέση. στην καινούργια θέση (που βρίσκεται στην τελευταία θέση) τοποθετούμε την ελάχιστη δυνατή τιμή, πχ. μείον άπειρο. εκτελούμε τη διαδικασία αύξησης της τιμής κλειδιού για το στοιχείο στην τελευταία θέση από την ελάχιστη δυνατή τιμή στην επιθυμητή τιμή: διαδικασία Heap-Increase-Key(A,i,key) ταξινόμηση σωρού
----O(lg n) ταξινόμηση σωρού
----O(lg n) ταξινόμηση σωρού 4
A κλειδί = 5, HeapInsert(A,κλειδί): 6 6 4 0 4 0 4 5 6 8 9 4 5 6 8 9 8 9 0 4 8 9 0 4 5 6 4 0 4 8 5 5 6 9 6 5 0 4 8 5 4 6 9 8 9 0 4 8 9 0 4 ταξινόμηση σωρού 5
ταξινόμηση σωρού 6
Αναφορές/Πηγές Εισαγωγή στους αλγόριθμους, Κεφάλαιο 6 ταξινόμηση σωρού