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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

h/2. Άρα, n 2 h/2-1 h 2log(n+1). Πως υλοποιούµε τη LookUp()? Πολυπλοκότητα?

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

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

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

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

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

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

Ελάχιστα Γεννητορικά ένδρα

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

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

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

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

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

Heapsort Using Multiple Heaps

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

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

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

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

ΕΝΟΤΗΤΑ 5 ΥΝΑΜΙΚΑ ΛΕΞΙΚΑ ΙΣΟΖΥΓΙΣΜΕΝΑ ΕΝ ΡΑ

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

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

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

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

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

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

Άπληστοι Αλγόριθµοι (CLR, κεφάλαιο 17)

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

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

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

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

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

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

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

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

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

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

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

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

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

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

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

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

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

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

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

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

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

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

υαδικά έντρα Αναζήτησης

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

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

Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής και Τηλεπικοινωνιών. Παραλληλία. Κ. Χαλάτσης, Εισαγωγή στην Επιστήµη της Πληροφορικής και των Τηλεπικοινωνιών

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

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

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

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

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

έντρα Πολλαπλής ιακλάδωσης και (a, b)- έντρα

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

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

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

Insert(K,I,S) Delete(K,S)

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

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Transcript:

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

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

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

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

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

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

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

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

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

Εισαγωγή κόµβου Σε ένα πλήρες δυαδικό δένδρο υπάρχει µία µόνο θέση όπου µπορεί να εισαχθεί κόµβος και η εισαγωγή να διατηρήσει το δένδρο πλήρες. Αυτή η θέση είναι η πιο δεξιά στο τελευταίο επίπεδο του δένδρου, και αντιστοιχεί στη θέση 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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-10

ιαδικασία Εισαγωγής 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; } ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-11

Παράδειγµα: Εισαγωγή του 3 32 28 32 44 42 44 42 28 3 32 32 44 42 28 44 42 28 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-12

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

ιαδικασία ιαγραφής ελάχιστου στοιχείου 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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-14

Παράδειγµα: ιαγραφή του 3 3 22 22 22 44 26 28 44 26 28 44 26 28 22 22 26 26 44 28 44 28 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-15

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

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

ιαδικασία Καθόδου Μη αναδροµική διαδικασία 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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-18

Παράδειγµα PercoladeDown εδοµένα Εισόδου: i = 2, n = 9, A = [ -, 13, 8, 15, 4, 7, 20, 18, 5, 2] 13 8 15 4 7 20 18 k=8 5 2 13 13 15 4 15 4 7 20 18 2 7 20 18 5 2 5 8 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-19

ιαδικασία 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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-20

Παράδειγµα: ιαγραφή του 3 3 28 22 22 22 44 26 28 44 26 28 44 26 22 22 26 44 26 44 28 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-21

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

Κτίσιµο σωρού από ένα πίνακα Μπορούµε να µετατρέψουµε ένα πίνακα Α[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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-23

Τι κάνει ο πιο κάτω αλγόριθµος; 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 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-24

Παράδειγµα Εκτέλεσης εδοµένα Εισόδου: A = [ -, 34, 8, 64, 57, 32, 21] 1 8 2 32 21 3 4 57 5 34 64 6 Μετά από την πρώτη επανάληψη του for-loop: [21, 32, 64, 57, 34, 8] 1 21 2 32 64 3 57 34 4 5 8 6 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-25

Παράδειγµα Εκτέλεσης Μετά από τη δεύτερη επανάληψη του for-loop: [32, 34, 64, 57, 21, 8] 1 32 2 34 64 3 57 21 4 5 8 6 Μετά από την τρίτη επανάληψη του for-loop: [34, 57, 64, 32, 21, 8] 1 34 2 57 64 3 32 21 4 5 8 6 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-26

Παράδειγµα Εκτέλεσης Μετά από την τέταρτη επανάληψη του for-loop: [57, 64, 34, 32, 21, 8] 1 57 2 64 34 3 32 21 4 5 8 6 Μετά από την πέµπτη επανάληψη του for-loop: [64, 57, 34, 32, 21, 8] 1 64 2 57 34 3 εδοµένο Εξόδου 32 21 4 5 8 6 ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου, 2006 9-

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

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

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

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

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