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

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

Δοµές Δεδοµένων. 12η Διάλεξη Διάσχιση Δέντρων και Ουρές Προτεραιότητας. Ε. Μαρκάκης

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

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

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Quicksort Κεφάλαιο 7. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση Mergesort Κεφάλαιο 8. Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

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

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

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

Heapsort Using Multiple Heaps

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

Δοµές Δεδοµένων. 18η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

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

1.1 Αλγόριθμοι Ένα ενδεικτικό πρόβλημα: συνδετικότητα Αλγόριθμοι ένωσης-εύρεσης Προοπτική Σύνοψη θεμάτων 46

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Δοµές Δεδοµένων. 8η Διάλεξη: Ταξινόµηση. Ε. Μαρκάκης

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

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

Δοµές Δεδοµένων. 10η Διάλεξη Ταξινόµηση. E. Μαρκάκης

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Δέντρα Δυαδικής Αναζήτησης Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Δοµές Δεδοµένων. 13η Διάλεξη Πίνακες Συµβόλων. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Εξωτερική Αναζήτηση και Β-δέντρα Κεφάλαιο 16. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

Ο αλγόριθμος Quick-Sort. 6/14/2007 3:42 AM Quick-Sort 1

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

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

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

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

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

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

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

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

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

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

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

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

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

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

Δοµές Δεδοµένων. 16η Διάλεξη Κατακερµατισµός. Ε. Μαρκάκης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ταξινόµηση - Στοιχειώδεις µέθοδοι Κεφάλαιο 6. Ε. Μαρκάκης Επίκουρος Καθηγητής

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

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

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

Βασικές Προτάσεις. έντρα. υαδικά έντρα Αναζήτησης ( Α) Ισοζυγισµένα έντρα και Υψος. Κάθε δέντρο µε n κόµβους έχει n 1 ακµές.

Merge Sort (Ταξινόμηση με συγχώνευση) 6/14/2007 3:04 AM Merge Sort 1

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

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

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

Δοµές Δεδοµένων. 17η Διάλεξη Ισορροπηµένα δέντρα. Ε. Μαρκάκης

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

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

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

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

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

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

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

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

Στοιχεία Θεωρίας Γραφηµάτων (4) - έντρα

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

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

Δοµές Δεδοµένων. 2η Διάλεξη Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Ε. Μαρκάκης. Βασίζεται στις διαφάνειες των R. Sedgewick K.

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αλγόριθµοι Ένωσης-Εύρεσης (Union-Find) Κεφάλαιο 1. Ε. Μαρκάκης Επικ. Καθηγητής

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

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

Δοµές Δεδοµένων. 4η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες και Λίστες. Ε. Μαρκάκης

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

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

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

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

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

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

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

Ταχεία Ταξινόμηση Quick-Sort

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

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

Δοµές Δεδοµένων. 15η Διάλεξη Δέντρα Δυαδικής Αναζήτησης και Κατακερµατισµός. Ε. Μαρκάκης

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

Transcript:

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

Περίληψη Ουρές προτεραιότητας Στοιχειώδεις υλοποιήσεις Δοµή δεδοµένων σωρού Αλγόριθµοι σε σωρούς Ο αλγόριθµος heapsort Δοµές Δεδοµένων 11-2

Ουρές προτεραιότητας Έστω Ν ασθενείς στα επείγοντα ενός νοσοκοµείου Κάθε ασθενής έχει µία προτεραιότητα ανάλογα µε τη σοβαρότητα της κατάστασης (π.χ. περιστατικά όπου απειλείται άµεσα η ζωή του ασθενούς έχουν µεγαλύτερη προτεραιότητα) Ανά πάσα στιγµή µπορεί να εισέρχονται νέα περιστατικά (Ν++), ενδεχοµένως µε υψηλότερη προτεραιότητα Οι γιατροί µετά το τέλος µίας εξέτασης πρέπει να δέχονται ως επόµενο ασθενή τον ασθενή µε την τρέχουσα υψηλότερη προτεραιότητα από αυτούς που περιµένουν Δοµές Δεδοµένων 11-3

Ουρές προτεραιότητας Λειτουργία ουράς προτεραιότητας (priority queue) Δοµή δεδοµένων για στοιχεία µε κλειδιά Υποστηριζόµενες λειτουργίες: Εισαγωγή νέου στοιχείου Αφαίρεση στοιχείου µε το µεγαλύτερο κλειδί (ή το µικρότερο: ανάλογα την εφαρµογή) Δοµές Δεδοµένων 11-4

Ουρές προτεραιότητας Αφηρηµένος τύπος δεδοµένων ουράς προτεραιότητας class PQ { PQ(int) //το µέγιστο µέγεθος της ουράς boolean empty() void insert(item) ITEM getmax() }; Άλλες πιθανές επιθυµητές λειτουργίες ουρών προτεραιότητας Αλλαγή προτεραιότητας κάποιου στοιχείου Αφαίρεση στοιχείου (όχι απαραίτητα του µεγίστου) Ένωση ουρών προτεραιότητας Μπορούν να υλοποιηθούν και µε απλούς τρόπους Οι εξειδικευµένες υλοποιήσεις είναι όµως πιο γρήγορες Δοµές Δεδοµένων 11-5

Ουρές προτεραιότητας Πολλές πρακτικές εφαρµογές Συστήµατα προσοµοιώσεων: χρονολογική επεξεργασία γεγονότων Λειτουργικά συστήµατα, δροµολόγηση: επιλογή διεργασιών (κλειδιά αντιστοιχούν σε προτεραιότητες που δείχνουν ποιοι χρήστες ή ποιες διεργασίες πρέπει να εξυπηρετηθούν πρώτοι) Ουρές προτεραιότητας και ταξινόµηση Μπορούν να χρησιµοποιηθούν για ταξινόµηση Εισάγουµε όλα τα στοιχεία στην ουρά Εισαγωγή µε κλειδί το πεδίο ως προς το οποίο γίνεται η ταξινόµηση Τα αφαιρούµε µε την getmax Δεν είναι όµως µόνο εργαλεία ταξινόµησης Δοµές Δεδοµένων 11-6

Παράδειγµα ταξινόµησης Έστω ότι έχουµε έναν πίνακα µε τα στοιχεία [8, 4, 6, 1, 2]! Μπορούµε να κάνουµε 5 εισαγωγές σε ουρά προτεραιότητας! Και µετά 5 κλήσεις της getmax! Θα δούµε αργότερα και µια πιο αποδοτική υλοποίηση όπου όλες οι λειτουργίες γίνονται κατευθείαν πάνω στον αρχικό πίνακα

Παράδειγµα ταξινόµησης Αρχικά 5 εισαγωγές 8 1 2 4 6 Ουρά προτεραιότητας

Παράδειγµα ταξινόµησης 1 2 4 6 Ουρά προτεραιότητας Μετά την 1 η getmax 8

Παράδειγµα ταξινόµησης 1 2 4 Ουρά προτεραιότητας 6 8 Μετά την 2 η getmax

Παράδειγµα ταξινόµησης 1 2 Ουρά προτεραιότητας 4 6 8 Μετά την 3 η getmax

Παράδειγµα ταξινόµησης 1 Ουρά προτεραιότητας 2 4 6 8 Μετά την 4 η getmax

Παράδειγµα ταξινόµησης Ουρά προτεραιότητας 1 2 4 6 8 Μετά την 5 η getmax

Ουρές προτεραιότητας Οι ουρές προτεραιότητας είναι γενίκευση όλων των άλλων ουρών που έχουµε δει µέχρι τώρα Στοίβα: ουρά προτεραιότητας όπου το στοιχείο που ωθείται τελευταίο έχει τη µεγαλύτερη προτεραιότητα Ουρά FIFO: ουρά προτεραιότητας όπου το στοιχείο που έχει παραµείνει τον περισσότερο χρόνο έχει τη µεγαλύτερη προτεραιότητα Δοµές Δεδοµένων 11-14

Στοιχειώδεις υλοποιήσεις Μπορεί να υλοποιηθεί µε λίστα ή πίνακα Ταξινοµηµένος ή αταξινόµητος πίνακας; Αταξινόµητος πίνακας Ράθυµη (lazy) προσέγγιση Εισαγωγή: σταθερό κόστος O(1) Αφαίρεση µεγίστου: γραµµικό κόστος O(N) (διατρέχουµε όλο τον πίνακα) Ταξινοµηµένος πίνακας Πρόθυµη (eager) προσέγγιση Εισαγωγή: γραµµικό κόστος O(N) (πρέπει το στοιχείο να µπει στη σωστή θέση) Αφαίρεση µεγίστου: σταθερό κόστος O(1) Δοµές Δεδοµένων 11-15

Στοιχειώδεις υλοποιήσεις Αταξινόµητος Πίνακας Ταξινοµηµένος Πίνακας insert O(1) O(N) getmax O(N) O(1) Σταθερό κόστος και για τις 2 λειτουργίες? Πιο δύσκολο πρόβληµα! Δοµές Δεδοµένων 11-16

Στοιχειώδεις υλοποιήσεις class PQ { //υλοποίηση µε αταξινόµητο πίνακα static boolean less(item v, ITEM w) { return v.less(w); } static void exch(item[] a, int i, int j) { ITEM t = a[i]; a[i] = a[j]; a[j] = t; } private ITEM[] pq; private int N; //περιέχει το µέγεθος της ουράς PQ(int maxn) { pq = new ITEM[maxN]; N = 0; } boolean empty() { return N == 0; } void insert(item item) { pq[n++] = item; } ITEM getmax() { int max = 0; for (int j = 1; j < N; j++) if (less(pq[max], pq[j])) max = j; exch(pq, max, N-1); //µετακίνηση στο τέλος return pq[--n]; } }; //ενηµέρωση του Ν Δοµές Δεδοµένων 11-17

Στοιχειώδεις υλοποιήσεις Όλες οι άλλες πράξεις έχουν ανάλογα κόστη Αφαίρεση, αλλαγή προτεραιότητας Γραµµικό ή σταθερό ανάλογα µε την υλοποίηση Μικρή ωφέλεια αν χρησιµοποιήσουµε λίστα Αντισταθµίζεται από το κόστος των δεικτών Πολυπλοκότητα σε ένα πρόγραµµα πελάτη εξαρτάται και από τη συχνότητα εµφάνισης των λειτουργιών εισαγωγής ή αφαίρεσης Δοµές Δεδοµένων 11-18

Δοµή δεδοµένων σωρού Δυαδικό δέντρο: κάθε κόµβος έχει 0 ή 1 ή 2 παιδιά Πλήρες δυαδικό δέντρο: όλα τα επίπεδα γεµάτα εκτός του τελευταίου, στο οποίο οι κόµβοι εισέρχονται από τα αριστερά προς τα δεξιά Ισοζυγισµένο δέντρο εκτός ίσως από το τελευταίο επίπεδο Για N κόµβους έχουµε το πολύ O(lοgN) επίπεδα Δοµές Δεδοµένων 11-19

Δοµή δεδοµένων σωρού Πλήρη δυαδικά δέντρα στη φύση: Hyphaene Compressa, Ανατολική Αφρική Δοµές Δεδοµένων 11-20

Δοµή δεδοµένων σωρού Μας ενδιαφέρουν πλήρη δυαδικά δέντρα όπου κάθε κόµβος έχει ένα κλειδί (προτεραιότητα) Σωρός (Heap): πλήρες δυαδικό δέντρο όπου το κλειδί κάθε κόµβου είναι µεγαλύτερο ή ίσο από τα κλειδιά των παιδιών του Η ρίζα έχει το µεγαλύτερο κλειδί του δέντρου Λέµε επίσης ότι το δέντρο είναι διατεταγµένο σε σωρό (heap-sorted) Ή ότι ικανοποιεί την ιδιότητα max-heap property (µεγιστοστρεφής σωρός) Αντίστοιχα µπορούµε να ορίσουµε σωρούς που ικανοποιούν την min-heap property Δοµές Δεδοµένων 11-21

Δοµή δεδοµένων σωρού Αναπαράσταση µε πίνακα (βολεύει πάρα πολύ) Η ρίζα (κόµβος 1) βρίσκεται στη θέση 1 του πίνακα (σύµβαση: αφήνουµε τη θέση 0 κενή) Τα παιδιά του κόµβου i είναι στις θέσεις 2i και 2i+1 Ο γονέας του κόµβου i είναι στη θέση floor(i/2) Βασιζόµαστε στο ότι το δέντρο είναι πλήρες Σε κάθε δυαδικό σωρό αντιστοιχεί ένας πίνακας µε τις ιδιότητες αυτές Εύκολη µετάβαση από γονείς σε παιδιά και αντίστροφα Δοµές Δεδοµένων 11-22

Αλγόριθµοι σε σωρούς Όταν εισάγουµε ή εξάγουµε ένα στοιχείο στο σωρό ενδέχεται να παραβιαστεί η ιδιότητα του σωρού Αποκατάσταση ιδιότητας σωρού: περίπτωση 1 Το κλειδί ενός κόµβου γίνεται µεγαλύτερο από αυτό του γονέα του (έστω ότι τα υπόλοιπα κλειδιά είναι ok) Συµβαίνει όταν εισάγουµε νέους κόµβους Συνήθως οι εισαγωγές γίνονται στο τέλος του σωρού Ανάδυση: Ανεβάζουµε τον κόµβο προς τα επάνω (swim) Αν είναι µεγαλύτερος από τον πατέρα, θα είναι και από τον αδελφό private void swim(int k) { while (k > 1 && less(k/2, k)) { exch(k, k/2); k = k/2; } } Δοµές Δεδοµένων 11-23

Αλγόριθµοι σε σωρούς Αποκατάσταση ιδιότητας σωρού: περίπτωση 2 Το κλειδί ενός κόµβου γίνεται µικρότερο από αυτά των παιδιών του Συµβαίνει όταν κάνουµε εξαγωγή και αντικατάσταση Κατάδυση: κατεβάζουµε τον κόµβο προς τα κάτω (sink) Ανεβάζουµε το µεγαλύτερο από τα παιδιά του private void sink(int k, int N) { while (2*k <= N) { } int j = 2*k;//βρες µεγαλύτερο παιδί if (j < N && less(j, j+1)) j++; if (!less(k, j)) break;//ανεβάζει exch(k, j); k = j; }//µεγαλύτερο Δοµές Δεδοµένων 11-24

Αλγόριθµοι σε σωρούς Υλοποίηση ουράς προτεραιότητας µε σωρό Εισαγωγή: βάζουµε το στοιχείο στο τέλος του σωρού και κάνουµε swim µέχρι να αποκατασταθεί η ιδιότητα του σωρού Αφαίρεση µεγίστου: ανταλλαγή ρίζας µε τελευταίο στοιχείο, επιστροφή τελευταίου στοιχείου και sink της νέας ρίζας Κόστος πράξεων Ύψος πλήρους δυαδικού δέντρου µε Ν στοιχεία: logn Σε κάθε λειτουργία διατρέχουµε ένα µονοπάτι από τη ρίζα ως κάποιο φύλλο Εισαγωγή: το πολύ lοgn συγκρίσεις Στη χειρότερη περίπτωση µία σύγκριση ανά επίπεδο Εξαγωγή µέγιστου: το πολύ 2lοgN συγκρίσεις Δύο συγκρίσεις (µε τα δύο παιδιά) ανά επίπεδο Ο(logN) και για τις 2 λειτουργίες Δοµές Δεδοµένων 11-25

Αλγόριθµοι σε σωρούς - Insert 26 32 21 Insert 28 26 32 21 24 20 19 8 24 20 19 8 15 6 12 15 6 12 28 Ανάδυση 28 32 21 Ανάδυση 26 32 21 24 26 19 8 24 28 19 8 15 6 12 20 15 6 12 20 Δοµές Δεδοµένων 11-26

Αλγόριθµοι σε σωρούς Υλοποίηση ουράς προτεραιότητας µε σωρό class PQ { private boolean less(int i, int j) { return pq[i].less(pq[j]); } private void exch(int i, int j) { ITEM t = pq[i]; pq[i] = pq[j]; pq[j] = t; } private void swim(int k) private void sink(int k, int N) private ITEM[] pq; private int N; PQ(int maxn) { pq = new ITEM[maxN+1]; N = 0; } boolean empty() { return N == 0; } void insert(item v) { pq[++n] = v; swim(n); } ITEM getmax() { exch(1, N); sink(1, N-1); return pq[n--]; } }; Δοµές Δεδοµένων 11-27

Αλγόριθµοι σε σωρούς Κατασκευή σωρού από τυχαία στοιχεία Διαδοχικές εισαγωγές: εισαγωγή στο τέλος και swim Όταν ο σωρός έχει ήδη i στοιχεία, κόστος εισαγωγής = log i Συνολικό worst-case κόστος για κατασκευή σωρού µε Ν στοιχεία: log2 + log3 + + logn NlogN Στη µέση περίπτωση απαιτεί γραµµικό χρόνο Θα βελτιώσουµε τη χειρότερη περίπτωση σε λίγο Δοµές Δεδοµένων 11-28

Αλγόριθµοι σε σωρούς Άλλες λειτουργίες ουράς προτεραιότητας: Aλλαγή προτεραιότητας Έστω ότι θέλουµε να µεταβάλουµε την προτεραιότητα ενός στοιχείου της ουράς Όταν αλλάζουµε την προτεραιότητα σε έναν κόµβο του δέντρου µπορεί να καταστραφεί η ιδιότητα του σωρού Αποκατάσταση µε swim ή sink Όµως: για να αλλάξουµε την προτεραιότητα ενός στοιχείου, πρέπει να ξέρουµε πού είναι αποθηκευµένο στον πίνακα Με κατάλληλες προσθήκες/τροποποιήσεις, η αλλαγή προτεραιότητας µπορεί να υλοποιηθεί σε Ο(logN) (πώς?) Αφαίρεση στοιχείου Πάλι πρέπει να ξέρουµε πού είναι αποθηκευµένο Με παρόµοιες ιδέες, η αφαίρεση µπορεί να υλοποιηθεί σε Ο(logN) Δοµές Δεδοµένων 11-29

Αλγόριθµοι σε σωρούς Απλή ταξινόµηση µε σωρό Προσοχή: ο σωρός ΔΕΝ είναι ταξινοµηµένος πίνακας Η ιδιότητα του σωρού ισχύει µόνο µεταξύ γονέα-παιδιού 1ο βήµα: κατασκευάζουµε το σωρό 2ο βήµα: αφαιρούµε τα στοιχεία µε τη σειρά Απαιτεί χρήση δεύτερου πίνακα (όπως η mergesort) Τρέχει σε O(NlogN) class Sort { } static void sort(item[] a, int p, int r) { int k; PQ pq = new PQ(r-p+1); for (k = p; k <= r; k++) pq.insert(a[k]); for (k = r; k >= p; k--) a[k] = pq.getmax(); } Δοµές Δεδοµένων 11-30

Ο αλγόριθµος heapsort Ταξινόµηση µε σωρό χωρίς πρόσθετο πίνακα Κατασκευή του σωρού πάνω στον ίδιο τον πίνακα a Θυσιάζουµε τη γενική υλοποίηση για λόγους απόδοσης Δηµιουργία υποσωρών από κάτω προς τα πάνω Ιδέα: Θεωρούµε τον a ως αναπαράσταση πλήρους δυαδικού δέντρου Μπορούµε να το κάνουµε αυτό για οποιοδήποτε πίνακα όπου αγνοούµε το στοιχείο στη θέση 0 Θα προσπαθήσουµε να επιβάλουµε την ιδιότητα του σωρού Αρχικά θεωρούµε ότι όλα τα φύλλα είναι σωροί ενός στοιχείου Αποκαθιστούµε την ιδιότητα του σωρού σε κάθε υποδέντρο καλώντας τη sink από κάτω προς τα πάνω (ξεκινάµε από τον πρώτο κόµβο που δεν είναι φύλλο) Όταν φτάσουµε στη ρίζα, ο πίνακας πλέον ικανοποιεί την ιδιότητα του σωρού Δοµές Δεδοµένων 11-31

Ο αλγόριθµος heapsort Υλοποίηση heapsort 1ο βήµα: κατασκευή του σωρού από κάτω προς τα πάνω στον πίνακα a 2ο βήµα: εξαγωγή των στοιχείων και τοποθέτηση στο τέλος Υποθέτουµε τα στοιχεία είναι στις θέσεις 1 ως Ν, εύκολα προσαρµόζεται αν ήταν από p ως r for (int k = N/2; k >= 1; k--) sink(k, N); //µετατροπή του a σε σωρό while (N > 1) { exch(1, N); sink(1, --N); } Οι sink και exch εκτελούνται πάνω στον πίνακα a και όχι σε ΑΤΔ ουράς προτεραιότητας Δοµές Δεδοµένων 11-32

Ο αλγόριθµος heapsort Ανάλυση κόστους 1 ο βήµα: Μετατροπή του πίνακα σε σωρό από κάτω προς τα πάνω: Ο(Ν) Έστω ότι έχουµε ένα γεµάτο δέντρο (παρόµοια ανάλυση για άλλα δέντρα) Π.χ. Ν = 127 ή πιο γενικά N = 2 n - 1 για κάποιο n Θα έχουµε 64 (= 2 n-1 ) φύλλα (δηλαδή σωρούς µε ένα στοιχείο) 32 (= 2 n-2 ) σωρούς στο προτελευταίο επίπεδο 16 (=2 n-3 ) σωρούς στο προπροτελευταίο επίπεδο... Σε κάθε υποσωρό το κόστος της sink είναι όσο και το ύψος του υποσωρού Συνολικό κόστος κατασκευής: k2 n k 1 n 1 k=1 = 2 n n 1< N Δοµές Δεδοµένων 11-33

Ο αλγόριθµος heapsort 2 ο βήµα: Διαδοχική τοποθέτηση µεγίστου στο τέλος Κάθε εξαγωγή απαιτεί χρόνο Ο(lοgN), άρα συνολικά Ο(ΝlogN) Συνολικά: Ο(Ν) + Ο(ΝlogN) = Ο(ΝlogN) Στην πράξη η Quicksort παραµένει η πιο γρήγορη µέθοδος Η heapsort τρέχει σε χρόνο παρόµοιο µε τη mergesort Δεν χρειάζεται όµως πρόσθετο χώρο (αντίθετα µε τη mergesort) Δοµές Δεδοµένων 11-34

Ο αλγόριθµος heapsort Παράδειγµα ταξινόµησης µε σωρό Δηµιουργία σωρού (σε µορφή δέντρου) Τα στοιχεία ταξινοµούνται µερικώς Ταξινόµηση µε βάση το σωρό (σε µορφή πίνακα) Ουσιαστικά ταξινόµηση µε επιλογή Επιταχύνεται όµως η επιλογή! Δοµές Δεδοµένων 11-35

Το τελικό βάθρο... Στη θεωρία: Heapsort Mergesort Quicksort Δοµές Δεδοµένων 11-36

Το τελικό βάθρο... Στην πράξη: Quicksort Heapsort Mergesort Σηµείωση: Σε κάποιες περιπτώσεις η Mergesort µπορεί να είναι καλύτερη από Heapsort (είναι ευσταθής, έχει ακολουθιακή πρόσβαση στα δεδοµένα, locality of reference, είναι πιο εύκολα parallelized) Δοµές Δεδοµένων 11-37

Επεκτάσεις και άλλες υλοποιήσεις ουράς Ουρές προτεραιότητας µε χρήση 3-αδικού σωρού Ό,τι και πριν αλλά µε 3-αδικά δέντρα Ή ακόµα πιο γενικά µε d-αδικά δέντρα Μειώνεται ακόµα περισσότερο το ύψος, µε µικρή επιβάρυνση στις καταδύσεις Ουρές µε διωνυµικούς σωρούς (binomial heaps) Με χρήση µη δυαδικών δέντρων Επιτρέπει γρήγορη υλοποίηση της ένωσης 2 σωρών Ουρές µε Fibonacci heaps Καλύτερη πολυπλοκότητα σε βάθος χρόνου Δοµές Δεδοµένων 11-38