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

Σχετικά έγγραφα
#4. Heaps (σωροί), η ταξινόμηση HeapSort, η δομή std::priority_queue της STL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Red-Black Δέντρα. Red-Black Δέντρα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Heapsort Using Multiple Heaps

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

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

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

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

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

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

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

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

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

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

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

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

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

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

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

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

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

Κεφάλαιο 10 Ψηφιακά Λεξικά

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

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

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

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

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

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

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

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

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

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

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

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

Οι ϐασικές πράξεις που ορίζονται για τη δοµή δεδοµένων σωρός, είναι η πράξη της εισαγωγής και η πράξη της διαγραφής ενός στοιχείου.

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

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

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

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

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

Ταξινόμηση. Σαλτογιάννη Αθανασία

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

Προγραμματιστικές Τεχνικές

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

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

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

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

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

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

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

έντρα ομές εδομένων 3ο εξάμηνο ιδάσκων: Χρήστος ουλκερίδης ιαφάνειες προσαρμοσμένες από το υλικό της Μαρίας Χαλκίδη

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

Transcript:

Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 17 Σωροί (Heaps) έκδοση 10 1 / 19

Heap Σωρός Ο σωρός είναι μια μερικά ταξινομημένη δομή δεδομένων που υποστηρίζει τις ακόλουθες λειτουργίες: εύρεση του στοιχείου με τη μεγαλύτερη τιμή κλειδιού διαγραφή του στοιχείου με τη μεγαλύτερη τιμή κλειδιού προσθήκη νέου κλειδιού στη δομή Ένας σωρός μπορεί να έχει στη κορυφή το μεγαλύτερο στοιχείο (Max-Heap) ή αντίστοιχα να έχει στη κορυφή το μικρότερο στοιχείο (Min-Heap) Στη δεύτερη περίπτωση οι λειτουργίες της εύρεσης και της διαγραφής αφορούν τη μικρότερη τιμή κλειδιού 2 / 19

Πότε χρησιμοποιείται ο σωρός; Όταν η εφαρμογή που πρέπει να υλοποιηθεί πραγματοποιεί επαναλαμβανόμενους υπολογισμούς του μέγιστου στοιχείου Μπορεί να υλοποιηθεί με κατάλληλο τρόπο έτσι ώστε να επιστρέφει αποδοτικά την k-οστή μεγαλύτερη τιμή 3 / 19

Ο σωρός ως δυαδικό δένδρο Ένας σωρός μπορεί να οριστεί ως ένα δυαδικό δένδρο για το οποίο ισχύουν οι ακόλουθοι 2 περιορισμοί: 1 πληρότητα: το δυαδικό δένδρο είναι συμπληρωμένο, δηλαδή όλα τα επίπεδά του είναι πλήρη εκτός πιθανά από το τελευταίο επίπεδο στο οποίο μπορούν να λείπουν μόνο τα δεξιότερα φύλλα 2 κυριαρχία γονέα: το κλειδί σε κάθε κορυφή είναι μεγαλύτερο ή ίσο από τα κλειδιά των παιδιών (σε Max-Heap) 4 / 19

Ιδιότητες του σωρού στη δενδρική του απεικόνιση Η ρίζα του σωρού περιέχει το μεγαλύτερο στοιχείο Κάθε κόμβος του σωρού μαζί με όλους τους απογόνους του είναι και αυτός σωρός Τα κλειδιά είναι ταξινομημένα από πάνω προς τα κάτω δηλαδή τα κλειδιά σε κάθε διαδρομή από την κορυφή προς τα φύλλα είτε μειώνονται είτε παραμένουν στην ίδια τιμή Τα κλειδιά σε κάθε επίπεδο του δένδρου δεν είναι ταξινομημένα Τα παιδιά κάθε κόμβου δεν είναι ταξινομημένα 5 / 19

Εισαγωγή νέου κλειδιού στο σωρό Το νέο κλειδί εισάγεται ως φύλλο στο δένδρο όσο πιο αριστερά γίνεται Το νέο κλειδί επαναληπτικά συγκρίνεται με τον γονέα του και αν είναι μεγαλύτερο τον αντικαθιστά 6 / 19

Το νέο κλειδί ανεβαίνει προς τη σωστή θέση 7 / 19

Το νέο κλειδί ανεβαίνει προς τη σωστή θέση 8 / 19

Διαγραφή της ρίζας του σωρού Το κλειδί που αντιμετατέθηκε με τη ρίζα συγκρίνεται με τα παιδιά του και σε περίπτωση που είναι μικρότερο αντιμετατίθεται με το μεγαλύτερο από τα παιδιά του Η διαδικασία επαναλαμβάνεται μέχρι το κλειδί που αντιμετατέθηκε με τη ρίζα να είναι μεγαλύτερο ή ίσο από τα παιδιά του 9 / 19

Αντιμετάθεση της ρίζας με το τελευταίο φύλλο του δένδρου 10 / 19

Το κλειδί που αντικατέστησε τη ρίζα κατεβαίνει προς τη σωστή θέση 11 / 19

Το κλειδί που αντικατέστησε τη ρίζα κατεβαίνει προς τη σωστή θέση 12 / 19

Η δενδρική δομή του σωρού ως πίνακας Ένας σωρός μπορεί να υλοποιηθεί με ένα πίνακα καταγράφοντας τα στοιχεία από πάνω προς τα κάτω και από αριστερά προς τα δεξιά Τα κελιά γονείς βρίσκονται στις πρώτες n ενώ τα φύλλα 2 καταλαμβάνουν τις τελευταίες n 2 θέσεις Τα παιδιά για κάθε κλειδί στις θέσεις i από 1 μέχρι και n βρίσκονται στις 2 θέσεις 2i και 2i + 1 Ο γονέας για κάθε κλειδί στις θέσεις i από 2 μέχρι και n βρίσκεται στη θέση i 2 13 / 19

Σχέση στοιχείων πίνακα Ένας σωρός (Max-Heap) με n στοιχεία μπορεί να οριστεί ως ένας πίνακας H [1 n] για τον οποίο ισχύει ότι κάθε στοιχείο στη θέση i στο πρώτο μισό του πίνακα είναι μεγαλύτερο ή ίσο από τα στοιχεία στις θέσεις 2i και 2i + 1 H[i] max {H [2i], H [2i + 1]} i = 1,, n 2 (1) 14 / 19

Δημιουργία σωρού από κάτω προς τα πάνω (bottom up) Ξεκινώντας από τον τελευταίο στη σειρά κόμβο γονέα ο αλγόριθμος ελέγχει αν ικανοποιείται η κυριαρχία γονέα για τη τιμή κλειδιού K που διαθέτει Αν δεν ισχύει τότε η τιμή κλειδιού K ανταλλάσσεται με την τιμή κλειδιού του μεγαλύτερου από τα κλειδιά των παιδιών και ελέγχεται αν η κυριαρχία γονέα ισχύει για το K στη νέα του θέση Η διαδικασία συνεχίζεται μέχρι να ικανοποιηθεί για το K η κυριαρχία γονέα Στη συνέχεια η ίδια διαδικασία ακολουθείται για τον επόμενο κόμβο γονέα και μέχρι να έρθει η σειρά της ρίζας const int static MAX_HEAP_SIZE = 1000; int heap_size = 0; template<class T> T* heap_bottom_up(t* a, int N) { T* heap = new T[MAX_HEAP_SIZE](); heap_size = N; heap[0] = NULL; for ( int i = 0; i < N; i++) heap[i + 1] = a[ i ]; for ( int i = heap_size / 2; i >= 1; i ) heapify(heap, i ) ; return heap; } template<class T> void heapify(t* heap, int k) { int v = heap[k]; bool flag = false ; while (! flag && 2 * k <= heap_size) { int j = 2 * k; if ( j < heap_size) if (heap[j] < heap[j + 1]) j++; if (v >= heap[j]) flag = true ; else { heap[k] = heap[j ]; k = j ; } } heap[k] = v; } 15 / 19

Εισαγωγή νέου κλειδιού στο σωρό Εισαγωγή κόμβου με κλειδί K στο σωρό Αρχικά ο κόμβος προσαρτάται στο τέλος του σωρού (δηλαδή μετά το τελευταίο φύλλο του δένδρου) Στη συνέχεια το κλειδί ανεβαίνει στη κατάλληλη θέση ως εξής: Το K συγκρίνεται με το κλειδί του γονέα του και αν το κλειδί του γονέα είναι μεγαλύτερο η διαδικασία τερματίζει αλλιώς τα 2 κλειδιά αντιμετατίθενται και το κλειδί K συγκρίνεται με το κλειδί του νέου γονέα του Η διαδικασία συνεχίζεται μέχρι το K να είναι μικρότερο ή ίσο με τον γονέα του ή να έχει φτάσει στη ρίζα του δένδρου (δλδ στο στοιχείο 1 του πίνακα) template<class T> void insert_key(t* h, T key) { heap_size++; h[heap_size] = key; int pos = heap_size; while (pos!= 1 && h[pos / 2] < h[pos]) { swap(h[pos / 2], h[pos]); pos = pos / 2; } } 16 / 19

Διαγραφή μέγιστου κλειδιού από το σωρό Διαγραφή του στοιχείου που βρίσκεται στη ρίζα του δένδρου Το κλειδί που βρίσκεται στη ρίζα αντιμετατίθεται με το τελευταίο στοιχείο του σωρού Το μέγεθος του σωρού μειώνεται κατά 1 και εκτελείται η διαδικασία heapify για το νέο πρώτο στοιχείο του σωρού template<class T> void maximum_key_deletion(t* heap) { swap(heap[1], heap[heap_size]); heap_size ; heapify(heap, 1); } 17 / 19

Heapsort Ο αλγόριθμος Heapsort προτάθηκε από τον JWJWilliams το 1964 και αποτελείται από 2 στάδια: 1 Δημιουργία σωρού με τα n στοιχεία ενός πίνακα τα στοιχεία του οποίου ζητείται να ταξινομηθούν 2 Εφαρμογή της διαγραφής της ρίζας n 1 φορές Το αποτέλεσμα είναι ότι τα στοιχεία αφαιρούνται από το σωρό σε φθίνουσα σειρά Καθώς κατά την αφαίρεσή του κάθε στοιχείο τοποθετείται στο τέλος του σωρού τελικά ο σωρός περιέχει τα αρχικά δεδομένα σε αύξουσα σειρά template<class T> T* heap_sort(t* a, int N) { T* heap = heap_bottom_up(a, N); for ( int i = 1; i < N; i++) maximum_key_deletion(heap); return heap; } 18 / 19

Απόδοση του αλγορίθμου Heapsort Το στάδιο δημιουργίας του σωρού (heap_bottom_up) έχει πολυπλοκότητα O(n) ενώ το στάδιο των διαδοχικών διαγραφών της ρίζας (maximum_key_deletion) έχει πολυπλοκότητα O(n log n) Συνεπώς η πολυπλοκότητά του Heapsort είναι O(n) + O(n log n) = O(n log n) Ο αλγόριθμος Heapsort είναι in place (σε θέση) δηλαδή μπορεί να υλοποιηθεί χωρίς να απαιτεί επιπλέον χώρο Στην πράξη έχει συγκρίσιμη ταχύτητα εκτέλεσης με το MergeSort αλλά είναι λιγότερο γρήγορος από το Quicksort 19 / 19