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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

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

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

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

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

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

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

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

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

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

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

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

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

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

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

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

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

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

Heapsort Using Multiple Heaps

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

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

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

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

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

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

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

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

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

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

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

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

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

ΔυαδικάΔΕΝΔΡΑΑναζήτησης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

υαδικό έντρο Αναζήτησης (BSTree)

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

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

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

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

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

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

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

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

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

οµές εδοµένων 3 ο Εξάµηνο ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ

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

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

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

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

5 ΔΕΝΤΡΑ (Trees) Σχήµα 5.1 : ενδροειδής αναπαράσταση αρχείων στα Windows. έντρα. \ {root directory} Accessories. Program Files.

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

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

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

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

Quicksort [Hoare, 62] Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Quicksort 1

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

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

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

ένδρα u o Κόµβοι (nodes) o Ακµές (edges) o Ουρά και κεφαλή ακµής (tail, head) o Γονέας Παιδί Αδελφικός κόµβος (parent, child, sibling) o Μονοπάτι (pat

Transcript:

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

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

Διάσχιση δέντρου Διάσχιση δέντρου (tree traversal) Έστω ότι θέλουµε να επεξεργαστούµε όλους τους κόµβους του δέντρου µε συστηµατικό τρόπο 4 βασικές επιλογές διάσχισης Προδιατεταγµένη (preorder): επεξεργαζόµαστε πρώτα έναν κόµβο, και µετά επεξεργαζόµαστε το αριστερό και δεξιό υποδέντρο Ενδοδιατεταγµένη (inorder): επεξεργαζόµαστε πρώτα το αριστερό υποδέντρο, µετά τον κόµβο, και µετά το δεξί υποδέντρο Μεταδιατεταγµένη (postorder): αριστερό υποδέντρο, δεξί υποδέντρο, και στο τέλος ο κόµβος Διάσχιση ανά επίπεδο (level-order): πρώτα η ρίζα, µετά όλοι οι κόµβοι στο επίπεδο 1, κ.ο.κ. (ή µε ανάποδη σειρά από κάτω προς τα πάνω) Δοµές Δεδοµένων 12-3

Διάσχιση δέντρου Αναδροµική υλοποίηση για preorder, inorder, postorder Γενική µορφή κώδικα διάσχισης (preorder) //έστω visit() μία μέθοδος που επεξεργάζεται έναν κόμβο /*η διάσχιση παίρνει ως όρισμα τον δείκτη από όπου ξεκινάμε π.χ. τη ρίζα του δέντρου */ private void traverser(node h) { if (h == null) return; h.item.visit(); traverser(h.l); traverser(h.r); } void traverse() { traverser(root); } Παρόμοιος κώδικας για inorder, postorder Δοµές Δεδοµένων 12-4

Διάσχιση δέντρου Παράδειγµα διάσχισης Α) προδιατεταγµένη Β) ενδοδιατεταγµένη Γ) µεταδιατεταγµένη Δ) ανά επίπεδο Δοµές Δεδοµένων 12-5

Διάσχιση δέντρου Μη αναδροµική διάσχιση δέντρου Στην αναδροµή οι κλήσεις µπαίνουν στη στοίβα Χρησιµοποιώντας τη δική µας στοίβα δεν χρειάζεται αναδροµή Αντί για κλήση, ωθούµε τον κόµβο ή το υποδέντρο στη στοίβα private void traverses(node h) { NodeStack s = new NodeStack(max); s.push(h); while (!s.empty()) { h = s.pop(); h.item.visit(); if (h.r!= null) s.push(h.r); if (h.l!= null) s.push(h.l); } } void traverses() { traverses(root); } Δοµές Δεδοµένων 12-6

Διάσχιση δέντρου Διάσχιση δέντρου ανά επίπεδο Επισκεπτόµαστε τους κόµβους στο ίδιο επίπεδο µε τη σειρά Απλά αντικαθιστούµε τη στοίβα µε ουρά Eπεξεργαζόµαστε τους κόµβους µε τη σειρά που τους βλέπουµε Δεν υπάρχει προφανής αναδροµική υλοποίηση private void traverseq(node h) { NodeQueue q = new NodeQueue(max); q.put(h); while (!q.empty()) { h = q.get(); h.item.visit(); if (h.l!= null) q.put(h.l); if (h.r!= null) q.put(h.r); } } void traverseq() { traverseq(root); } Δοµές Δεδοµένων 12-7

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

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

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

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

Στοιχειώδεις υλοποιήσεις Μπορεί να υλοποιηθεί µε λίστα ή πίνακα Ταξινοµηµένος ή αταξινόµητος πίνακας; Αταξινόµητος πίνακας (πρόγραµµα) Ράθυµη (lazy) προσέγγιση Εισαγωγή: σταθερό κόστος Αφαίρεση µεγίστου: γραµµικό κόστος (διατρέχουµε όλο τον πίνακα) Ταξινοµηµένος πίνακας Πρόθυµη (eager) προσέγγιση Εισαγωγή: γραµµικό κόστος (πρέπει το στοιχείο να µπει στη σωστή θέση) Αφαίρεση µεγίστου: σταθερό κόστος Σταθερό κόστος και για τις 2 λειτουργίες? Πιο δύσκολο πρόβληµα! Δοµές Δεδοµένων 12-12

Στοιχειώδεις υλοποιήσεις 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]; } }; Δοµές Δεδοµένων 12-13

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

Δοµή δεδοµένων σωρού Δυαδικό δέντρο: κάθε κόµβος έχει 0 ή 1 ή 2 παιδιά Πλήρες δυαδικό δέντρο: όλα τα επίπεδα γεµάτα εκτός του τελευταίου, στο οποίο οι κόµβοι είναι όσο το δυνατόν αριστερότερα Για N κόµβους έχουµε το πολύ lοgn επίπεδα Σωρός (Heap): πλήρες δυαδικό δέντρο όπου το κλειδί κάθε κόµβου είναι µεγαλύτερο ή ίσο µε τα κλειδιά των παιδιών του Η ρίζα έχει το µεγαλύτερο κλειδί του δέντρου Λέµε επίσης ότι το δέντρο είναι διεταταγµένο σε σωρό (heap-sorted) Δοµές Δεδοµένων 12-15

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

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

Αλγόριθµοι σε σωρούς Αποκατάσταση ιδιότητας σωρού: περίπτωση 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; } } Δοµές Δεδοµένων 12-18

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

Αλγόριθµοι σε σωρούς Υλοποίηση ουράς προτεραιότητας µε σωρό 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--]; } }; Δοµές Δεδοµένων 12-20

Αλγόριθµοι σε σωρούς Κατασκευή σωρού από τυχαία στοιχεία Διαδοχικές εισαγωγές: εισαγωγή στο τέλος και swim Όταν ο σωρός έχει ήδη i στοιχεία, κόστος εισαγωγής = log i Συνολικό κόστος για κατασκευή σωρού µε Ν στοιχεία: log 1 + log 2+ +logn NlogN Στη µέση περίπτωση απαιτεί γραµµικό χρόνο Θα βελτιώσουµε τη χειρότερη περίπτωση σε λίγο Άλλες λειτουργίες ουράς προτεραιότητας: Οι λειτουργίες αλλαγής προτεραιότητας και αφαίρεσης µπορούν να υλοποιηθούν σε χρόνο Ο(logN) Δοµές Δεδοµένων 12-21

Αλγόριθµοι σε σωρούς Απλή ταξινόµηση µε σωρό Προσοχή: ο σωρός ΔΕΝ είναι ταξινοµηµένος Η ιδιότητα του σωρού ισχύει µόνο µεταξύ γονέα-παιδιού 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(); } Δοµές Δεδοµένων 12-22

Ο αλγόριθµος heapsort Ταξινόµηση µε σωρό χωρίς πρόσθετο πίνακα Κατασκευή του σωρού στον ίδιο τον πίνακα a Θυσιάζουµε τη γενική υλοποίηση για λόγους απόδοσης Δηµιουργία υποσωρών από κάτω προς τα πάνω Θεωρούµε τον a ως αναπαράσταση πλήρους δυαδικού δέντρου Αρχικά όλα τα φύλλα είναι σωροί ενός στοιχείου Αποκαθιστούµε την ιδιότητα του σωρού σε κάθε υποδέντρο καλώντας τη sink από κάτω προς τα πάνω Όταν φτάσουµε στη ρίζα έχει µείνει ένας µόνο σωρός Δοµές Δεδοµένων 12-23

Ο αλγόριθµος 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 και όχι σε ΑΤΔ ουράς προτεραιότητας Δοµές Δεδοµένων 12-24

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

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

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

Ο αλγόριθµος heapsort Χρήση σωρού για επιλογή Εντοπισµός των k µεγαλύτερων από τα N στοιχεία Η ταξινόµηση λύνει το πρόβληµα σε χρόνο NlοgN Ο σωρός λύνει το πρόβληµα σε γραµµικό χρόνο για µικρό k 1η µέθοδος (προφανής) Κατασκευάζουµε το σωρό σε χρόνο Ο(N) Αφαιρούµε k στοιχεία σε χρόνο 2klοgN 2η µέθοδος (όχι τόσο προφανής) Κατασκευάζουµε έναν ανάποδο σωρό µε k στοιχεία Η εξαγωγή αφαιρεί το µικρότερο στοιχείο Κάνουµε N-k εισαγωγές ακολουθούµενες από εξαγωγές του ελάχιστου Κάθε φορά βγάζουµε το µικρότερο από k+1 στοιχεία Συνολικό κόστος 2k + 2(N-k)lοgk Δοµές Δεδοµένων 12-28