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

Σχετικά έγγραφα
Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

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

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

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

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

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

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

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

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

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

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

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

Heapsort Using Multiple Heaps

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

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

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

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

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

Διάλεξη 04: Παραδείγματα Ανάλυσης

Προγραμματισμός Ι (ΗΥ120)

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

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

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

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

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

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

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

ταξινόμηση σωρού Παύλος Εφραιμίδης Δομές Δεδομένων και

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

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

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

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

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

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

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

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

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

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

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

σωροί ταξινόμηση σωρού οόροςheap σωρός (heap) συστοιχία Α για έναν σωρό μια δομή δεδομένων που πχ.

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Οντοκεντρικός Προγραμματισμός

Cuckoo Hashing. Αλγόριθμοι και Πολυπλοκότητα. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Transcript:

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

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

Ουρά Προτεραιότητας (συν.) Ουρά Προτεραιότητας Ο ΑΤΔ ουρά προτεραιότητας ορίζεται ως μια ακολουθία στοιχείων συνοδευόμενη από τις πράξεις: Delete_Min*: Διαγράφει το ελάχιστο στοιχείο Θεωρούμε ότι το μικρότερο κλειδί έχει τη μεγαλύτερη προτεραιότητα Insert: Εισάγει ένα καινούριο στοιχείο ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 3

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

Ο ΑΤΔ Σωρός Σωρός ελαχίστων (MinHeap) είναι ένα δυαδικό δένδρο που ικανοποιεί: δομική ιδιότητα: είναι πλήρες ιδιότητα σειράς: το κλειδί ενός κόμβου είναι μικρότερο από τα κλειδιά των παιδιών του Σε κάθε υπόδενδρο, το μικρότερο στοιχείο βρίσκεται στη ρίζα. Δεν υπάρχει καμιά σχέση μεταξύ κλειδιών αδελφών. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5

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

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

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

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

Υλοποίηση Σωρού Ένας σωρός μπορεί να υλοποιηθεί ως μια εγγραφή Ηeap με τρία πεδία: 1. size (τύπου int): αποθηκεύει το μέγεθος του σωρού. 2. maxsize (τύπου int): το μέγιστο μέγεθος του πίνακα, 3. contents (τύπου πίνακα): τα στοιχεία του σωρού. Αυτή η δομή θα πρέπει να υποστηρίζει τις πράξεις: makeεmpty, isempty, isfull, insert, deletemin. public class Heap { } } private int contents[]; private int size; private int maxsize; public Heap(int n) { this.contents = new int[n]; this.size = 0; this.maxsize = n-1; public boolean isempty(){ return this.size==0; } public boolean isfull(){ return this.size==this.maxsize; } ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 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 Δομές Δεδομένων και Αλγόριθμοι 11

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 12 Σωρός με Στατική Δέσμευση Μνήμης: Υλοποίηση Συνάρτηση public void insert(int k); : public void insert(int k) { if (this.size < this.maxsize) { int index = this.size + 1; while (index > 1 && this.contents[(index / 2)] > k) { this.contents[index] = this.contents[(index / 2)]; index = index / 2; } this.contents[index] = k; this.size++; } } this.contents[0] = this.size;

Παράδειγμα 1: Εισαγωγή σε Σωρό ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 13 32 29 32 29 44 42 Insert 3 44 42 3<29 Move 29 3 root=3 32 3< Move 32 44 42 29 44 42 29 0 1 2 3 4 5 6 7 0 3 32 44 42 29

Παράδειγμα 2: Εισαγωγή σε Σωρό ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 14 32 29 32 29 44 42 Insert 28 44 42 28<29 Move 29 32 28> Save 32 28 44 42 29 44 42 29 0 1 2 3 4 5 6 7 0 32 28 44 42 29

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 16 Σωρός με Στατική Δέσμευση Μνήμης: Υλοποίηση Συνάρτηση public int deletemin() : public int deletemin() { int min = 0, last; int x = 1, child = 0; } if (!isempty()) { min = this.contents[1]; last = this.contents[this.size]; this.size--; this.contents[0] = this.size; while ((x * 2) <= this.size) { child = x * 2; if (child!= this.size && this.contents[child + 1] < this.contents[child]) child++; if (last > this.contents[child]) { this.contents[x] = this.contents[child]; x = child; } else break; } this.contents[x] = last; } return min;

Παράδειγμα 3: Εξαγωγή από Σωρό 3 Delete Min Last 28 22< 22:Move up Last 28 22 22 22 44 26 28 Decrease Size 44 26 44 26 26<44, Last>26 26:Move up 22 22 26 26 44 Reached Leaf Set to last 44 28 0 1 2 3 4 5 6 0 22 26 44 28 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 17

Παράδειγμα 4: Εξαγωγή από Σωρό 3 Delete Min Last 22< 22:Move up 22 Decrease Size 102 22 104 109 101 102 104 109 101 Last 102 22 22 104 109 101 104<109, Last<104 Last:Move up BREAK 102 104 109 101 0 1 2 3 4 5 6 0 22 102 104 109 101 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 18

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 20 Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Η διαδικασία PercolateDown, Δημιουργία Σωρού - O Αλγόριθμος Ταξινόμησης HeapSort - Υλοποίηση, Παραδείγματα - Παραλλαγές Σωρών

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 22 Διαδικασία Καθόδου PercolateDown (συν.) Μη αναδρομική διαδικασία PercolateDown public static void PercolateDown(int A[], int n, int i) { int k = A[i]; int j; } 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;

Παράδειγμα Εκτέλεσης PercolateDown int A[]={-1, 13, 8, 15, 4, 7, 20, 18, 5, 2}; i=2, n=9, PercolateDown(A, 9, 2); k=8 Aν φανταστούμε τον πίνακα σαν δυαδικό δέντρο 1. 2. 3. 4. 5. ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 23

Διαδικασία DeleteMin (2) Αφαιρούμε το στοιχείο της ρίζας (είναι το μικρότερο κλειδί του σωρού). Μεταφέρουμε το τελευταίο κλειδί στη ρίζα, και εφαρμόζουμε τη διαδικασία PercoladeDown(A, n, 1): public static int deletemin(heap h) { int min = 0; int swap = 0; if (!h.isempty()) { min = h.contents[1]; // swap(contents[1],contents[size]) swap = h.contents[1]; h.contents[1] = h.contents[h.size]; h.contents[h.size] = swap; h.size--; PercolateDown(h.contents, h.size, 1); } return min; } Χρόνος Εκτέλεσης: O(h) = Ο(log n) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 24

Παράδειγμα DeleteMin(2) 3 Delete Min Swap with last 28 Percolate Down 28 22 22 22 44 26 28 44 26 28 44 26 22<, 28>22 22: Move up 22 26<44, 28>26 26: Move up 22 22 26 44 26 44 26 44 28 0 1 2 3 4 5 6 0 22 26 44 28 break Set to 28 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 25

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

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

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 29 Παράδειγμα Εκτέλεσης Διαδικασίας mystery Είσοδος, Α={ -(6)-, 34, 8, 64, 57, 32, 21} 34 8 64 57 32 21 Μετά την εκτέλεση της γραμμής BuildHeap 8 32 21 57 34 64

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 30 Παράδειγμα Εκτέλεσης Διαδικασίας mystery Μετά από την πρώτη επανάληψη του for 21 32 64 57 34 8 Μετά από την δεύτερη επανάληψη του for 32 34 64 57 21 8

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 31 Παράδειγμα Εκτέλεσης Διαδικασίας mystery Μετά από την τρίτη επανάληψη του for 34 57 64 32 21 8 Μετά από την τέταρτη επανάληψη του for 57 64 34 32 21 8

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 32 Παράδειγμα Εκτέλεσης Διαδικασίας mystery Μετά από την πέμπτη επανάληψη του for 64 57 34 32 21 8 Σε επίπεδο πίνακα - 64 57 34 32 21 8

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

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

Συγχώνευση Σωρών (Merge Heap) Υποθέστε την ύπαρξη των δυαδικών σωρών h1 και h2. Πως μπορούν να συγχωνευτούν σε ένα καινούριο σωρό h; Προσπάθεια Α: Πρόσθεσε όλα τα στοιχεία του σωρού h1 στον h2. Χρόνος Εκτέλεσης; Προσπάθεια Β: Βρες τον πιο μικρό από τους δύο σωρούς (έστω h2) και πρόσθεσε όλα τα στοιχεία του σωρού h2 στον h1. Χρόνος Εκτέλεσης; Προσπάθεια Γ: Συνένωσε τους δύο σωρούς (δηλ., δημιούργησε ένα καινούριο πίνακα και αποθήκευσε τα στοιχεία του σωρού h1 πρώτα και μετά τα στοιχεία του σωρού h2) και μετά τρέξε τη διαδικασία BuildHeap. Χρόνος Εκτέλεσης; ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 35

Προσπάθεια Δ: Leftist Heaps Ιδέα: Η συντήρηση της σωρού να γίνεται σε ένα μικρό μέρος της σωρού Τα περισσότερα στοιχεία βρίσκονται στα αριστερά Η διαδικασία της συγχώνευσης γίνεται στα δεξιά ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 36 Πως το επιτυγχάνουμε; Ορισμός Null Path Length Null Path Length (npl) κάποιου κόμβου u: ο αριθμός των κόμβων μεταξύ του u και μίας κενής αναφοράς (null) σε κάποιο από τα υποδέντρα του Εναλλακτικός ορισμός: Ελάχιστη απόσταση ενός κόμβου από κάποιο απόγονο που έχει 0 ή 1 παιδιά

Ιδιότητες Leftist Heap Ιδιότητα Σειράς (Σωρού) Η τιμή κάποιου κόμβου είναι μικρότερη από αυτή των παιδιών του Αποτέλεσμα: ο μικρότερος κόμβος είναι η ρίζα Ιδιότητα Leftist Για κάθε κόμβο u npl(u.left) npl(u.right) Αποτέλεσμα: για κάθε κόμβο το αριστερό του υποδέντρο είναι τουλάχιστον τόσο βαρύ όσο το δεξί του υποδέντρο ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 37

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 38 Υπολογισμός Null Path Length (npl) npl(null) = -1 NULL npl( u ) =? u? npl( u ) =? u?? 0?? 0 npl( u ) =? u 0 0 0

Γιατί χρειαζόμαστε την ιδιότητα Leftist Επειδή εγγυάται τα ακόλουθα: Το δεξί μονοπάτι είναι «κοντό» σε σχέση με τον αριθμό των κόμβων στο δέντρο Ένας σωρός leftist με Ν κόμβους έχει δεξί μονοπάτι με το πολύ log (N+1) κόμβους Αποτέλεσμα: κάνε τις αλλαγές στο δεξί «κοντό» υποδέντρο Πως θα εκτελεστεί η Συγχώνευση δύο σωρών h1 και h2; Βασική Ιδεά: Το πιο μικρό στοιχείο από h1 και h2 πρέπει να είναι η καινούρια ρίζα (έστω του h1) Το αριστερό υποδέντρο του h1 παραμένει αριστερά Αναδρομικά συγχώνευσε το δεξί υποδέντρο με το h2 ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 39

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 40 Συγχώνευση δύο Leftist Σωρών MergeHeaps(h1, h2): επιστρέφει ένα leftist σωρό που περιέχει τα στοιχεία (διακριτά στοιχεία) των leftist σωρών h1 και h2. merge h1 a a merge h2 L1 b R1 a < b L1 R1 b L2 R2 L2 R2

Συγχώνευση δύο Leftist Σωρών (συν.) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 41 a a npl(l1) < npl(r ) L1 R swap R L1 Χρονική Πολυπλοκότητα Συγχώνευσης;

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 42 Παράδειγμα MergeHeaps 1 npl 1 5 0 0 10 12 1 3 0 0 7 8 14 0 3<5 1 3 0 7 14 0 merge 5<8 8 0 1 5 5 0 0 0 10 10 12? merge 8 0 12 0 8<12

Παράδειγμα MergeHeaps 1 (συν.) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 43 1 8 0 1 5 3 npl(5) > npl(7) 12 0 0 10 0 8 0 1 7 5 swap 12 0 14 0 0 10 8 0 12 0 3 1 5 1 7 0 0 10 12 0 8 0 14 0

Παρατηρήσεις Η χρονική πολυπλοκότητα της MergeHeaps είναι O(log n) Η χρονική πολυπλοκότητα της Insert σε leftist σωρό με n στοιχεία; Χρήση της merge με h1=τον σωρό και τον καινούριο κόμβο σαν σωρό h2 Η χρονική πολυπλοκότητα της Delete σε leftist σωρό με n στοιχεία; Αφαίρεση της ρίζας και συγχώνευση του αριστερού και δεξιού υποδέντρου με χρήση της merge Προβλήματα leftist σωρών: Μνήμη; Πολυπλοκότητα; Το δεξιό υποδέντρο είναι συνήθως πιο «βαρετό» και χρειάζεται αλλαγή. Τι σημαίνει αυτό σε επίπεδο πίνακα; ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 44