Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ουρές Προτεραιότητας Σωροί υλοποίηση και πράξεις Ο αλγόριθμος ταξινόμησης HeapSort

Σχετικά έγγραφα
ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Ουρά Προτεραιότητας (priority queue)

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Ουρά Προτεραιότητας (priority queue)

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 4 Σωροί, Γράφοι

13/5/2015 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ. Δομές Δεδομένων. Ουρές Προτεραιότητας

Ουρά Προτεραιότητας: Heap

Αλγόριθµοι και Πολυπλοκότητα

Δομές Δεδομένων Ενότητα 4

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Ουρά Προτεραιότητας: Heap

Ενότητα 7 Ουρές Προτεραιότητας

ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου

Ουρά Προτεραιότητας: Heap

Δοµές Δεδοµένων. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Ουρές Προτεραιότητας 2

Δομές Δεδομένων και Αλγόριθμοι

Κατ οίκον Εργασία 4 Σκελετοί Λύσεων

Κεφάλαιο 6 Ουρές Προτεραιότητας

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Κεφάλαιο 2. Η δομή δεδομένων Σωρός και η Ταξινόμηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.3, 14/11/2014

Διδάσκων: Κωνσταντίνος Κώστα

Διάλεξη 18: B-Δένδρα

Πελάτες φθάνουν στο ταμείο μιας τράπεζας Eνα μόνο ταμείο είναι ανοικτό Κάθε πελάτης παρουσιάζεται με ένα νούμερο - αριθμός προτεραιότητας Όσο ο

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Ουρά Προτεραιότητας: Heap

Διάλεξη 14: Δέντρα IV - B-Δένδρα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 7η: Ουρές Προτεραιότητας Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Αλγόριθμοι ταξινόμησης

Κεφάλαιο 14 Προηγμένες Ουρές Προτεραιότητας

Ενότητα 7 Ουρές Προτεραιότητας

Πρόβληµα (ADT) Λεξικού. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Λεξικό, Union - Find 2

Διάλεξη 13: Δέντρα ΙΙΙ - Ισοζυγισμένα Δέντρα, AVL Δέντρα

Union Find, Λεξικό. Δημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Ουρές Προτεραιότητας: Υπενθύμιση. Σωροί / Αναδρομή / Ταξινόμηση. Υλοποίηση Σωρού. Σωρός (Εισαγωγή) Ορέστης Τελέλης

Βασικές Δομές Δεδομένων

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ουρές Προτεραιότητας. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Εισαγωγή στους Αλγορίθμους

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 8-1

Δομές Δεδομένων & Αλγόριθμοι

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

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

Σχεδίαση και Ανάλυση Αλγορίθμων

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

Δένδρα Αναζήτησης Πολλαπλής Διακλάδωσης

Εισαγωγή ενός νέου στοιχείου. Επιλογή i-οστoύ στοιχείου : Εύρεση στοιχείου με το i-οστό μικρότερο κλειδί

#4. Heaps (σωροί), η ταξινόμηση HeapSort, η δομή std::priority_queue της STL

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ουρές προτεραιότητας Κεφάλαιο 9. Ε. Μαρκάκης Επίκουρος Καθηγητής

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Βασικές οµές εδοµένων

Ταξινόμηση με συγχώνευση Merge Sort

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Ουρές προτεραιότητας

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Εισαγωγή στους Αλγορίθμους Ενότητα 3η

Κεφάλαιο 7 Λεξικά και Δυαδικά Δένδρα Αναζήτησης

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Heapsort Using Multiple Heaps

Quicksort. Πρόβλημα Ταξινόμησης. Μέθοδοι Ταξινόμησης. Συγκριτικοί Αλγόριθμοι

Αλγόριθμοι Eλάχιστα μονοπάτια

Δομές Δεδομένων (Data Structures)

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Λεξικό, Union Find. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Αλγόριθμοι Ταξινόμησης Μέρος 3

Συλλογές, Στοίβες και Ουρές

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Transcript:

Σωροί Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ουρές Προτεραιότητας Σωροί υλοποίηση και πράξεις Ο αλγόριθμος ταξινόμησης HeapSort ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-1

Ουρά προτεραιότητας Η δομή δεδομένων ουρά υποστηρίζει FIFO (first in first out) στρατηγική για εισαγωγές και διαγραφές στοιχείων. Σε διάφορες εφαρμογές, όμως, υπάρχει η ανάγκη επιλογής στοιχείωναπόκάποιοσύνολοσύμφωναμεκάποιασειρά προτεραιότητας (π.χ. σε λειτουργικά συστήματα). Σε ουρές προτεραιότητας κύρια σημασία έχει η προτεραιότητα του κάθε στοιχείου, πρώτο βγαίνει πάντα το στοιχείο με τη μεγαλύτερη προτεραιότητα. Ουρά Προτεραιότητας ΟΑΤΔουρά προτεραιότητας ορίζεται ως μια ακολουθία στοιχείων συνοδευόμενη από τις πράξεις Delete_Min *, και Insert. * Θεωρούμε ότι το μικρότερο κλειδί έχει τη μεγαλύτερη προτεραιότητα ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-2

Ουρά προτεραιότητας Πιθανές υλοποιήσεις: 1. συνδεδεμένη λίστα Insert: Ο(1), Delete_Min: O(n) 2. ταξινομημένη συνδεδεμένη λίστα Insert: Ο(n), Delete_Min: O(1) 3. δυαδικό δένδρο αναζήτησης Insert, Delete_Min: O(log n) Υπάρχει καλύτερη υλοποίηση; Ναι, μια ενδιαφέρουσα τάξη δυαδικών δένδρων, οι σωροί. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-3

Σωρός Σωρός ελαχίστων (MinHeap) είναι ένα δυαδικό δένδρο που ικανοποιεί: δομική ιδιότητα: είναι πλήρες ιδιότητα σειράς: το κλειδί ενός κόμβου είναι μικρότερο από τα κλειδιά των παιδιών του Σε κάθε υπόδενδρο, το μικρότερο στοιχείο βρίσκεται στη ρίζα. Δεν υπάρχει καμιά σχέση μεταξύ κλειδιών αδελφών κόμβων. Ποια από τα πιο κάτω δένδρα είναι σωροί; 27 27 27 32 28 32 28 32 28 44 60 44 23 60 44 33 60 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-4

Δυαδικά Δένδρα Ένα δυαδικό δένδρο είναι πλήρες (complete) αν 1. έχει ύψος 0 και ένα κόμβο, 2. έχει ύψος 1 και η ρίζα του έχει είτε δύο παιδιά είτε ένα αριστερό παιδί. 3. έχει ύψος h και η ρίζα του έχει ένα τέλειο αριστερό υπόδενδρο ύψους h-1 και ένα πλήρες δεξιό υπόδενδρο ύψους h-1, ή ένα πλήρες αριστερό υπόδενδρο ύψους h-1 και ένα τέλειο δεξιό υπόδενδρο ύψους h-2. Παραδείγματα δυαδικών δένδρων ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 6-5

Πλήρη Δυαδικά Δένδρα Σε ένα δυαδικό δένδρο, στο επίπεδο k υπάρχουν το πολύ 2 k-1 κόμβοι. Σε ένα πλήρες δυαδικό δένδρο ύψους h όλαταεπίπεδαμέχριτο h-οστό είναι εντελώς γεμάτα, και το επίπεδο h+1 είναι γεμάτο από τα αριστερά στα δεξιά. Ο αριθμός των κόμβων μέχρι το επίπεδο h δίνεται από το h άθροισμα i = 1 2 i 1 = 2 h 1 Επομένως, ένα πλήρες δένδρο ύψους h έχει μεταξύ 2 h και 2 h+1 1 κόμβους, ή 2 h n 2 h+1 1 Ένα πλήρες δένδρο με n κόμβους έχει ύψος Ο(log n). ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-6

Υλοποίηση με πίνακες Ένα πλήρες δυαδικό δένδρο μπορεί να αποθηκευτεί σε πίνακα ως εξής: στη θέση 1 βάζουμετοστοιχείοτηςρίζας αν κάποιος κόμβος u βρίσκεται στη θέση i, τότε τοποθετούμε το αριστερό του παιδί στη θέση 2i, καιτοδεξιότουπαιδίστηθέση2i +1. Ο πατέρας ενός κόμβου στη θέση i(εκτός από τη ρίζα) βρίσκεται στη θέση i/2. Πλεονέκτημα: Δεν χρειάζονται δείκτες, έτσι εξοικονομούμε μνήμη και έχουμε πιο απλές και πιο αποδοτικές διαδικασίες. Μειονέκτημα: πρέπει να γνωρίζουμε από την αρχή το μέγιστο μέγεθος του σωρού. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-7

Παράδειγμα αναπαράστασης σωρού (1) 27 32 28 44 42 Θέση 0 1 2 3 4 5 6 Στοιχείο 27 32 28 44 42 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-8

Παράδειγμα αναπαράστασης σωρού (2) Α Β Γ Δ Ε Ζ Η Θ Ι Κ Θέση 0 1 2 3 4 5 6 7 8 9 10 Στοιχείο A B Γ Δ Ε Ζ Η Θ Ι Κ ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-9

Υλοποίηση Σωρού Ένας σωρός μπορεί να υλοποιηθεί ως μια εγγραφή heap με τρία πεδία 1. size, τύπου int, όπου αποθηκεύεται το μέγεθος του σωρού. 2. maxsize, τύπου int, που δηλώνει το μέγεθος του πίνακα, και 3. contents, τύπου πίνακα, όπου αποθηκεύουμε τα στοιχεία του σωρού. Αυτήηδομήθαπρέπειναυποστηρίζειτιςπράξεις: ΜakeΕmpty, Ιnsert, DeleteMin, IsEmpty, IsFull. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-10

Εισαγωγή κόμβου Σε ένα πλήρες δυαδικό δένδρο υπάρχει μία μόνο θέση όπου μπορεί να εισαχθεί κόμβος και η εισαγωγή να διατηρήσει το δένδρο πλήρες. Αυτή η θέση είναι η πιο δεξιά στο τελευταίο επίπεδο του δένδρου, και αντιστοιχεί στη θέση size+1 του πίνακα. Γιαναεισάγουμεένακλειδίk σε ένα σωρό σκεφτόμαστε ως εξής: Πιθανόν το k να μην μπορεί να μπει στην κενή θέση size+1, γιατί μια τέτοια εισαγωγή να παραβιάζει τη δεύτερη ιδιότητα του σωρού. Έστωότιηκενήθέσηείναιηx, o πατέρας αυτής της θέσης είναι ο u, και k είναι το κλειδί του u. Τότε εφαρμόζουμε τα εξής: 1. αν k>k, ή, η θέσηx αντιστοιχεί στη ρίζα, τότε contents[x] = k 2. αν k<k, τότε βάλε το k στηθέσηx, και ανάλαβε να γεμίσεις τη θέση u, δηλαδή contents[x] =k ; x=u; και 3. επανάλαβε τη διαδικασία. Αυτή η διαδικασία σύγκρισης με τον πατρικό κόμβο και αναρρίχησης μπορεί να συνεχιστεί μέχρι τη ρίζα του δένδρου. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-11

Παράδειγμα: Εισαγωγή του 33 27 32 31 44 42 33 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-12

Παράδειγμα: Εισαγωγή του 28 27 32 31 44 42 28 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-13

Παράδειγμα: Εισαγωγή του 3 27 32 31 44 42 3 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-14

Διαδικασία Εισαγωγής Insert(int k, heap E){ check heap.size < heap.maxsize; int x = heap.size + 1; while(x>1 && contents[ x/2 ]>k){ contents[x] = contents[ x/2 ]; x = x/2 ; } contents[x] = k; Heap.size++ } ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-15

Διαγραφή του ελάχιστου στοιχείου Το ελάχιστο στοιχείο βρίσκεται πάντοτε στην κορυφή και η διαγραφή του προκαλεί μια κενή θέση στη ρίζα. Θα πρέπει να κατεβάσουμε αυτή την κενή θέση προς τα κάτω και δεξιά. Σε κάθε βήμα ελέγχουμε τα παιδιά της εκάστοτε κενής θέσης. Έστω ότι x είναι η κενή θέση, 1. Αν το κλειδί που βρίσκεται στην τελευταία θέση του σωρού είναι μικρότερο από τα κλειδιά των παιδιών του x τότε μεταφέρουμε το κλειδί αυτό στην κενή θέση και μειώνουμε το μέγεθος του σωρού contents [x] = contents [size]; size - και τερματίζουμε τη διαδικασία. 2. Διαφορετικά, διαλέγουμε το παιδί u του x το οποίο έχει το μικρότερο κλειδί, μεταφέρουμε το κλειδί του u στο x και κάνουμε κενή θέση τη u: contents[x] = contents[u]; x = u 3. και επαναλαμβάνουμε τη διαδικασία. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-16

Παράδειγμα: Διαγραφή του 3 3 22 27 44 26 28 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-17

Διαδικασία Διαγραφής ελάχιστου στοιχείου int Delete_Min(heap E) if IsEmpty(E) report error; return; min = elements[1]; last = elements[size]; size=size-1; x=1; while(x*2 <= size){ child = x*2; if (child!= size && elements[child+1]<elements[child]) child++; if (last>elements[child]) elements[x]=elements[child]; x=child; else break; } elements[x] = last; return min; ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-18

Μερικά Σχόλια Ο χρόνος εκτέλεσης των διαδικασιών Insert και Delete_min είναι της τάξης O(h) δηλαδή Ο(log n). (h: ύψος, n: αριθμός κόμβων) Ποιο είναι το όφελος της δομής σε σύγκριση με δυαδικά δένδρα αναζήτησης; Οι σωροί χρησιμοποιούνται ευρέως σε λειτουργικά συστήματα, συστήματα όπου γίνεται διαμερισμός του χρόνου του υπολογιστή σε > 1 εργασίες (task scheduling) και σε μεταγλωττιστές. Συμμετρικά, μπορούμε να ορίσουμε τη δομή maxheap, όπου η ρίζα περιέχει το μέγιστο στοιχείο και υποστηρίζεται η DeleteMax. Εκτός από δυαδικούς σωρούς, μπορούμε να ορίσουμε τους δ- σωρούς (d-heaps), όπου κάθε κόμβος έχει d παιδιά. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-19

Διαδικασία Καθόδου Έστω ένας πίνακας Α[1..n] και μια τιμή i, θα ορίσουμε διαδικασία PercoladeDown(i), η οποία μετακινεί το στοιχείο Α[i] μέσα στον σωρό προς τα κάτω όσο χρειάζεται. Έστω ότι Α[i] = k. Θεωρούμε πως η i είναι άδεια θέση. Αν η άδεια θέση έχει παιδί που περιέχει στοιχείο μικρότερο του k και x είναι το μικρότερο τέτοιο παιδί, τότε μετακινούμε το στοιχείο του x στην κενή θέση και μετακινούμε την κενή θέση στο x. Επαναλαμβάνουμε την ίδια διαδικασία μέχρι τη στιγμή που η κενή θέση δεν έχει παιδιά με στοιχεία μικρότερα του k. Τότε αποθηκεύουμε το k στην θέση αυτή. Ο χρόνος εκτέλεσης είναι ανάλογος του ύψους του κόμβου που αντιστοιχεί στη θέση i του σωρού. Δηλαδή, στη χείριστη περίπτωση, όπου i=n, Ο(lg n). ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-20

Διαδικασία Καθόδου Μη αναδρομική διαδικασία PercolateDown PercolateDown(int A[],int n,int i){ int k = A[i]; while (2*i <= n) { j = 2*i; if (j<n && A[j+1]<A[j]) j++; if (k > A[j]) A[i] = A[j]; i=j; else break; } A[i] = k; } ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-21

Παράδειγμα PercoladeDown Δεδομένα Εισόδου: i = 2, n = 9, A = [ -, 13, 8, 15, 4, 7, 20, 18, 5, 2] 13 if (j<n && A[j+1]<A[j]) j++; k= 8 8 15 if (k > A[j]) A[i] = k; if (k > A[i] A[j]) = A[j]; i=j; 4 7 20 18 A[i] = A[j]; i=j; 5 2 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-22

Διαδικασία DeleteMin (2) Αφαιρούμε το στοιχείο της ρίζας (είναι το μικρότερο κλειδί του σωρού). Μεταφέρουμε το τελευταίο κλειδί στη ρίζα, και εφαρμόζουμε τη διαδικασία PercoladeDown(A, n, 1): int DeleteMin2(heap A){ check that size > 0; return (contents[1]); swap(contents[1],contents[size]); size = size 1; PercoladeDown(contents, size, 1); } Χρόνος Εκτέλεσης: O(h) = Ο(log n) ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-23

Παράδειγμα: Διαγραφή του 3 3 k= 22 27 44 26 28 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-24

Έστω πίνακας Α[1..n]. Από πίνακες σε σωρούς Μπορούμε να θεωρήσουμε τον πίνακα ως ένα πλήρες δυαδικό δένδρο με n κόμβους. Αν για μια τιμή i το αριστερό και το δεξί υπόδενδρο του i ικανοποιούν τις ιδιότητες ενός σωρού, τότε, αν καλέσουμε τη διαδικασία PercolateDown(A, n, i) θα έχουμε σαν αποτέλεσμα το υπόδενδρο που ριζώνει στη θέση i να ικανοποιεί τις ιδιότητες ενός σωρού. i PercolateDown(i) σωρό ς σωρό ς σωρό ς ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-25

Κτίσιμο σωρού από ένα πίνακα Μπορούμε να μετατρέψουμε ένα πίνακα Α[1..n] σεένασωρόμεδιαδοχική εφαρμογή της διαδικασίας PercoladeDown() από κάτω προς τα πάνω. Παρατήρηση: οι θέσεις > n/2 αντιστοιχούν σε φύλλα. Διαδικασία BuildHeap: BuildHeap( int A[], int n) { } for (i=n/2; i>0; i--) PercoladeDown(A,n,i); Ορθότητα. Αποδεικνύεται με τη μέθοδο της επαγωγής: μετά από την εφαρμογή της διαδικασίας PercoladeDown(A,n,i), τα υπόδενδρα που ριζώνουν στις θέσεις i,..., n, ικανοποιούν τις ιδιότητες του σωρού. Ανάλυση του Χρόνου Εκτέλεσης. Ο ολικός χρόνος εκτέλεσης είναι ανάλογος του αθροίσματος των υψών όλων των εσωτερικών κόμβων, το οποίο είναι Ο(n). ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-26

Τι κάνει ο πιο κάτω αλγόριθμος; mystery (int A[], int n) { BuildHeap(A, n); for (i=n ; i>1; i--){ swap (A[1], A[i]); PercoladeDown(A, i-1, 1); } } ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-27

Παράδειγμα Εκτέλεσης Δεδομένα Μετά από την Εισόδου: δεύτερη πρώτη τρίτη πέμπτη τέταρτη A επανάληψη = [ -, 34, 8, του 64, του 57, for-loop: 32, 21] [34, [21, [32, [64, [57, 32, 34, 57, 64, 64, 34, 32, 57, 32, 21, 34, 21, 8] 8] Μετά από εφαρμογή της BuildHeap 1 32 34 21 57 8 k= k= k= 2 34 32 64 57 32 64 21 34 3 4 57 32 57 34 64 21 4 5 8 6 k= Δεδομένο Εξόδου ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-28

HeapSort H διαδικασία mystery ταξινομεί ένα πίνακα σε φθίνουσα σειρά. Αρχικά δημιουργεί ένα σωρό σε χρόνο Ο(n). Στη συνέχεια επαναλαμβάνει το εξής: αφαιρεί το μικρότερο στοιχείο (της ρίζας του σωρού) και το μετακινεί στο τέλος (εκτελεί την PercolateDown). Κάθε εκτέλεση της PercoladeDown χρειάζεται χρόνο της τάξης Ο(log n). Ολικός Χρόνος Εκτέλεσης: Ο(n log n) O αλγόριθμος ονομάζεται Heapsort. Μπορούμε εύκολα να αλλάξουμε τον κώδικα ώστε να επιστρέφεται η λίστα σε αύξουσα σειρά. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-29

Άλλες διαδικασίες σε σωρούς Παρόλοπουεύρεσητουελάχιστουκλειδιούσεένασωρόμπορεί να πραγματοποιηθεί σε σταθερό χρόνο, η εύρεση τυχαίου στοιχείου στη χειρότερη περίπτωση επιβάλλει διερεύνηση ολόκληρης της δομής (δηλαδή, είναι της τάξης Ο(n)). Αν όμως γνωρίζουμε τη θέση στοιχείων με κάποιο άλλο τρόπο, διαδικασίες σε σωρούς πραγματοποιούνται εύκολα, π.χ. οι πιο κάτω εκτελούνται σε χρόνο λογαριθμικό. Increase_Key(P,Δ), αυξάνει την προτεραιότητα του κλειδιού P, κατά Δ. Χρησιμοποιείται από χειριστές λειτουργικών συστημάτων για αύξηση της προτεραιότητας σημαντικών διεργασιών. Η συμμετρική διαδικασία Decrease_Key(P,Δ) συχνά εκτελείται αυτόματα σε λειτουργικά συστήματα σε περίπτωση που κάποια δουλειά χρησιμοποιεί υπερβολικά μεγάλη ποσότητα χρόνου του CPU. Remove(I), αφαιρεί τον κόμβο της θέσης Ι (χρήσιμη σε περίπτωση τερματισμού διαδικασίας). ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-30

Παραλλαγές Σωρών Leftist Heaps Ένα δυαδικό δένδρο Τ είναι leftist heap, αν για κάθε κόμβο u του Τ nullpath(u.left) nullpath(u.right) όπου nullpath(v) είναι η μικρότερη απόσταση του κόμβου v από κόμβο που έχει το πολύ ένα παιδί. Ο ορισμός αυτός επιτρέπει μη-ισοζυγισμένα δένδρα που είναι πιο βαθιά προς τα αριστερά. Ένα leftist heap Τ ικανοποιεί την πιο κάτω σημαντική ιδιότητα: αν το Τ έχει n κόμβους τότε το δεξί του μονοπάτι έχει το πολύ log(n+1) κόμβους. Το πλεονέκτημα αυτής της δομής είναι ότι επιτρέπει το συνδυασμό δύο σωρών σε ένα (διαδικασία Merge) σε χρόνο λογαριθμικό. Οι υπόλοιπες διαδικασίες (DeleteMin, Insert) επίσης πραγματοποιούνται σε λογαριθμικό χρόνο. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-31

Παραλλαγές Σωρών Διωνυμικές Ουρές Προτεραιότητας (Binomial Queues) ΗδομήBinomial queue είναι ένα δάσος που αποτελείται από ένα αριθμό δένδρων τα οποία ονομάζονται διωνυμικά δένδρα (binomial trees). Ένα διωνυμικό δένδρο ύψους 0 έχει ένα κόμβο. Ένα διωνυμικό δένδρο ύψους k, Β k, κτίζεται από ένα διωνυμικό δένδρο ύψους k- 1, με την εισαγωγή στη ρίζα του δένδρου ενός διωνυμικού υποδένδρου ύψους k-1. Β 0 Β 1 Β 2 ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-32

Παραλλαγές Σωρών Μια διωνυμική ουρά είναι ένα δάσος από διωνυμικά δένδρα Τ 1,, Τ n που ικανοποιούν την ιδιότητα σειράς ενός σωρού (δηλ. το στοιχείο κάθε κόμβου είναι μεγαλύτερο από αυτό των παιδιών του), και για κάθε i, j, height(t i ) = height(t j ) i=j. π.χ. Μιαουράπροτεραιότηταςμήκους6, μπορεί να αναπαρασταθεί ως το δάσος που αποτελείται από τα δένδρα Β 1 και Β 2. Μια διωνυμική ουρά προτεραιότητας υποστηρίζει τις διαδικασίες DeleteMin, και Merge σε χρόνο λογαριθμικό και επιπλέον τη διαδικασία Insert σε σταθερό χρόνο μέσης περίπτωσης. ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 9-33