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

Σχετικά έγγραφα
Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

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

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

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

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

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

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

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

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

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

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

Διαδικαστικός Προγραμματισμός

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

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

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

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

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

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

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

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

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

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

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Δομημένος Προγραμματισμός

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

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

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

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

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

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

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

Πληροφορική. Εργαστηριακή Ενότητα 3 η : Επεξεργασία Κελιών Γραμμών & Στηλών. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

Λογική Δημήτρης Πλεξουσάκης Φροντιστήριο 6: Προτασιακός Λογισμός: Μέθοδος Επίλυσης Τμήμα Επιστήμης Υπολογιστών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

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

Οικονομικά Μαθηματικά

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

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

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

Δομές δεδομένων. Ενότητα 8: Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find) Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Περιεχόμενα Ορισμός και λειτουργία των μηχανών Turing Θεωρία Υπολογισμού Ενότητα 20: Μηχανές Turing: Σύνθεση και Υπολογισμοί Επ. Καθ. Π. Κατσαρός Τμήμ

Μαθηματικά. Ενότητα 6: Ασκήσεις Ορίων Συνάρτησης. Σαριαννίδης Νικόλαος Τμήμα Λογιστικής και Χρηματοοικονομικής

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

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

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

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

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

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

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

Αλγόριθμοι και πολυπλοκότητα Μελανέρυθρα δεντρα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Μοντελοποίηση Λογικών Κυκλωμάτων

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

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

Πληροφορική. Εργαστηριακή Ενότητα 1 η : Εισαγωγή στα Λογιστικά Φύλλα με το MS Excel. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

ΘΕΩΡΙΑ ΠΑΙΓΝΙΩΝ. Ενότητα 7: Τέλεια ισορροπία Nash για υποπαίγνια. Ρεφανίδης Ιωάννης Τμήμα Εφαρμοσμένης Πληροφορικής

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

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προγραμματισμός Ηλεκτρονικών Υπολογιστών 1

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

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

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 6 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ. url:

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

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Εισαγωγή στον δομημένο προγραμματισμό

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

Οργανωσιακή Συμπεριφορά Ενότητα 1: Η έννοια της οργάνωσης και διοίκησης

Μαθηματικά. Ενότητα 3: Εξισώσεις και Ανισώσεις 1 ου βαθμού. Σαριαννίδης Νικόλαος Τμήμα Λογιστικής και Χρηματοοικονομικής

ΗΥ360 Αρχεία και Βάσεις εδοµένων

Transcript:

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

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Σκοποί ενότητας Να εισάγει τους φοιτητές στις έννοιες: πλήρες δυαδικό δέντρο, γεμάτο δδ, μέγιστο/ελάχιστο δδ, σωρός. Να μελετηθεί ο ΑΤΔ Μέγιστος Σωρός και η υλοποίηση του με δομή καθώς και να δοθεί η υλοποίηση όλων των πράξεων. 4

Περιεχόμενα ενότητας Εισαγωγή (heap) Γεμάτο δυαδικό δέντρο Πλήρες δυαδικό δέντρο Μέγιστο/Ελάχιστο δέντρο Σωρός Εισαγωγή (max heap) Ορισμός του ΑΤΔ Μέγιστος Σωρός Υλοποίηση δομής Εισαγωγή στοιχείου στο σωρό Διαγραφή στοιχείου από μέγιστο σωρό Πακέτο για τον ΑΤΔ Σωρός 5

Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό 6

Εισαγωγή (heap) Ο ΑΤΔ του σωρού (heap) που θα παρουσιάσουμε σε αυτό το κεφάλαιο αποτελεί ειδική περίπτωση του πλήρους δυαδικού δέντρου. Για να είμαστε σε θέση όμως να περιγράψουμε τον ΑΤΔ του σωρού θα πρέπει πρώτα να δώσουμε μια αναλυτικότερη περιγραφή των εξής δομών: γεμάτο δυαδικό δέντρο (full binary tree) πλήρες δυαδικό δέντρο (complete binary tree) μέγιστο/ελάχιστο δέντρο (max/min tree) 7

Γεμάτο δυαδικό δέντρο Ένα γεμάτο δυαδικό δέντρο (full binary tree) ύψους k είναι ένα δυαδικό δέντρο με 2k - 1 κόμβους, όπου k>=0. Ο αριθμός των κόμβων (2k - 1) ενός γεμάτου δυαδικού δέντρου είναι ο μέγιστος αριθμός κόμβων που μπορεί να έχει ένα δυαδικό δέντρο ύψους k. Στο σχήμα που ακολουθεί φαίνεται ένα γεμάτο δυαδικό δέντρο ύψους 4. Οι κόμβοι αριθμούνται ξεκινώντας με τη ρίζα που βρίσκεται στο 1ο επίπεδο, στη συνέχεια αριθμούνται οι κόμβοι του 2ου επιπέδου από αριστερά προς τα δεξιά κ.ο.κ. 8

Πλήρες δυαδικό δέντρο -1- Ένα πλήρες δυαδικό δέντρο (complete trees), είναι ένα δέντρο στο οποίο κάθε επίπεδο είναι συμπληρωμένο πλήρως, εκτός ίσως από το τελευταίο, στο οποίο οι κόμβοι βρίσκονται στις πιο αριστερές θέσεις ή αλλιώς ένα δυαδικό δέντρο ύψους k με n κόμβους, ονομάζεται πλήρες αν οι κόμβοι του αντιστοιχούν στους κόμβους 1 έως n ενός γεμάτου δυαδικού δέντρου ύψους k. Στο παρακάτω σχήμα φαίνεται ένα πλήρες δυαδικό δέντρο με 10 κόμβους. 9

Πλήρες δυαδικό δέντρο -2- Ο τρόπος αρίθμησης των κόμβων του πλήρους δυαδικού δέντρου μας επιτρέπει να χρησιμοποιήσουμε ένα μονοδιάστατο πίνακα για την αποθήκευση των κόμβων του. Για την αναπαράσταση ενός πλήρους δυαδικού δένδρου λοιπόν, χρησιμοποιούμε ένα πίνακα στον οποίο τοποθετούμε τη ρίζα στην θέση 1, τα παιδιά της στις θέσεις 2 και 3, τους κόμβους του επόμενου επιπέδου στις θέσεις 4, 5, 6, 7 κ.τ.λ. Η αναπαράσταση αυτή είναι πολύ χρήσιμη γιατί επιτρέπει την εύκολη μετάβαση από οποιαδήποτε κόμβο στον πατέρα και στα παιδιά του. 10

Πλήρες δυαδικό δέντρο -3- Στην περίπτωση αναπαράστασης ενός πλήρους δυαδικού δέντρου n κόμβων με ένα πίνακα, για κάθε κόμβο j: 1. ο πατέρας του βρίσκεται στη θέση j div 2, αν j 1. Αν j = 1 τότε πρόκειται για τη ρίζα, η οποία φυσικά δεν έχει πατέρα. 2. το αριστερό παιδί του βρίσκεται στη θέσης 2*j, αν 2*j > n. Αν 2*j > n τότε ο κόμβος j δεν έχει αριστερό παιδί. 3. το δεξί παιδί του βρίσκεται στη θέση 2*j+1, αν 2*j +1 > n. Αν 2*j +1 > n τότε ο κόμβος j δεν έχει δεξί παιδί.. 11

Πλήρες δυαδικό δέντρο -4- Αναπαράσταση ενός πλήρους δυαδικού δέντρου σχηματικά και με πίνακα: 1 2 3 4 5 6 7 8 9 10 Z T P F S M N A E R Με έντονα γράμματα φαίνεται η αρίθμηση των κόμβων, η οποία συμπίπτει και με τις θέσεις του πίνακα που αποθηκεύονται οι κόμβοι. 12

Μέγιστο/Ελάχιστο δέντρο Ένα μέγιστο δέντρο (max/min tree), είναι ένα δέντρο στο οποίο η τιμή του πεδίου κλειδιού κάθε κόμβου δεν είναι μικρότερη από τις τιμές των πεδίων κλειδιών των παιδιών του, εφόσον υπάρχουν. Ένα ελάχιστο δέντρο (min tree), είναι ένα δέντρο στο οποίο η τιμή του πεδίου κλειδιού κάθε κόμβου δεν είναι μεγαλύτερη από τις τιμές των πεδίων κλειδιών των παιδιών του, εφόσον υπάρχουν. Από τον ορισμό του μέγιστου και του ελάχιστου δέντρου, είναι προφανές ότι η τιμή του πεδίου κλειδιού της ρίζας ενός μέγιστου δέντρου είναι η μεγαλύτερη τιμή στο δέντρο, ενώ σε ένα ελάχιστο δέντρο είναι η μικρότερη τιμή. 13

Σωρός -1- Ο σωρός αποτελεί ειδική περίπτωση ενός πλήρους δυαδικού δέντρου και διακρίνεται σε μέγιστο και ελάχιστο σωρό: Ο μέγιστος σωρός (max heap) είναι ένα πλήρες δυαδικό δένδρο, το οποίο είναι ταυτόχρονα και ένα μέγιστο δέντρο. Αντίστοιχα, ο ελάχιστος σωρός (min heap) είναι ένα πλήρες δυαδικό δένδρο που είναι ταυτόχρονα και ένα ελάχιστο δέντρο. παραδείγματα μέγιστων σωρών παραδείγματα ελάχιστων σωρών 14

Σωρός -2- Στις περισσότερες εφαρμογές, όπως για παράδειγμα στις ουρές προτεραιότητας (priority queues) που υλοποιούνται με τον ΑΤΔ του σωρού, χρησιμοποιούνται μέγιστοι σωροί. Γι' αυτό και όταν αναφερόμαστε στη δομή του σωρού, χωρίς να προσδιορίζουμε αν πρόκειται για μέγιστο ή ελάχιστο σωρό, εννοούμε μέγιστο σωρό. Πολλές φορές μάλιστα χρησιμοποιείται ο παρακάτω ορισμός για το σωρό. Ο σωρός είναι ένα πλήρες δυαδικό δέντρο, του οποίου κάθε κόμβος ικανοποιεί την ιδιότητα προτεραιότητας, σύμφωνα με την οποία το κλειδί σε κάθε κόμβο πρέπει να είναι μεγαλύτερο ή ίσο από τα κλειδιά των παιδιών του (αν έχει). 15

Ο ΑΤΔ Μέγιστος Σωρός 16

Εισαγωγή (max heap) Ο ΑΤΔ του μέγιστου σωρού (max heap) περιλαμβάνει τις ακόλουθες βασικές λειτουργίες: δημιουργία ενός κενού σωρού εισαγωγή στοιχείου στο σωρό διαγραφή του μεγαλύτερου στοιχείου από το σωρό 17

Ορισμός του ΑΤΔ Μέγιστος Συλλογή στοιχείων δεδομένων: Ένα πλήρες δυαδικό δέντρο με n>0 στοιχεία οργανωμένα έτσι ώστε η τιμή σε κάθε κόμβο να είναι τουλάχιστο τόσο μεγάλη όσο εκείνη των παιδιών της. Βασικές λειτουργίες: Δημιουργία κενού σωρού (CreateMaxHeap): Λειτουργία: Δημιουργεί ένα κενό σωρό. Επιστρέφει: Ένα κενό σωρό. Σωρός -1- Έλεγχος άδειου σωρού (EmptyHeap): Δέχεται: Ένα σωρό. Λειτουργία: Ελέγχει αν ο σωρός είναι άδειος. Επιστρέφει: TRUE, αν ο σωρός είναι άδειος, FALSE διαφορετικά. 18

Ορισμός του ΑΤΔ Μέγιστος Σωρός -2- Εισαγωγή στοιχείου (InsertMaxHeap): Δέχεται: Ένα σωρό και ένα στοιχείο δεδομένων. Λειτουργία: Εισάγει το στοιχείο στο σωρό, αν ο σωρός δεν είναι γεμάτος. Επιστρέφει: Τον τροποποιημένο σωρό. Διαγραφή του μεγαλύτερου στοιχείου (DeleteMaxHeap): Δέχεται: Ένα σωρό. Λειτουργία: Ανακτά και διαγράφει το μεγαλύτερο στοιχείο του σωρού. Επιστρέφει: Το μεγαλύτερο στοιχείο του σωρού και τον τροποποιημένο σωρό. 19

Ορισμός του ΑΤΔ Μέγιστος Σωρός -3- Η υλοποίηση θα γίνει στατικά (με πίνακα) Έλεγχος γεμάτου σωρού (FullHeap): Δέχεται: Ένα σωρό. Λειτουργία: Ελέγχει αν ο σωρός είναι γεμάτος. Επιστρέφει: TRUE, αν ο σωρός είναι γεμάτος, FALSE διαφορετικά. 20

Υλοποίηση δομής Μια τέτοια δομή μπορεί να υλοποιηθεί με μια εγγραφή (struct), όπως φαίνεται παρακάτω: #define MaxElements 10 /*μέγιστο πλήθος στοιχείων του σωρού*/ typedef int HeapElementType; /*ο τύπος των στοιχείων του σωρού*/ typedef struct { HeapElementType key; // int Data; /*οποιοσδήποτε τύπος δεδομένων για τα παρελκόμενα στοιχεία του κόμβου */ } HeapNode; typedef struct { int Size; HeapNode Element[MaxElements+1]; } HeapType; 21

Εισαγωγή στοιχείου στο σωρό -1- Στο σχήμα που ακολουθεί φαίνεται ένας μέγιστος σωρός με 5 στοιχεία: Αν στο σωρό αυτό εισάγουμε ένα στοιχείο, τότε ο σωρός θα έχει τη δομή που φαίνεται παρακάτω, αφού ο μέγιστος σωρός είναι ένα πλήρες δυαδικό δέντρο. Εισαγωγή στοιχείου με τιμή κλειδιού 1: το στοιχείο μπορεί να εισαχθεί στο μέγιστο σωρό ως αριστερό παιδί του κόμβου με τιμή κλειδιού 2, οπότε θα προκύψει ο σωρός με τη δομή που φαίνεται παραπάνω 22

Εισαγωγή στοιχείου στο σωρό -2- Εισαγωγή στοιχείου με τιμή κλειδιού 5: στην περίπτωση αυτή το στοιχείο δεν μπορεί να εισαχθεί ως αριστερό παιδί του 2, γιατί τότε το πλήρες δυαδικό δέντρο που θα προκύψει δεν θα είναι ταυτόχρονα και μέγιστο δέντρο. Η επόμενη κίνησή μας είναι να μετακινήσουμε το 2 προς τα κάτω και συγκεκριμένα στη θέση του αριστερού παιδιού του (όπως φαίνεται στο Σχήμα) και να ελέγξουμε αν η εισαγωγή του 5 στην παλιά θέση του 2 οδηγεί ή όχι σε μέγιστο σωρό. Εφόσον, η τιμή κλειδιού του γονέα, η οποία είναι το 18, είναι τουλάχιστον τόσο μεγάλη όσο η τιμή του κλειδιού (5) του στοιχείου που εισάγεται, το στοιχείο μπορεί να εισαχθεί στη συγκεκριμένη θέση. 23

Εισαγωγή στοιχείου στο σωρό -3- Εισαγωγή στοιχείου με τιμή κλειδιού 20: αρχικά το 2 μετακινείται στη θέση του αριστερού παιδιού του, όπως φαίνεται στο Σχήμα. Στη συνέχεια ελέγχουμε αν το 20 μπορεί να εισαχθεί στην παλιά θέση του 2. Είναι προφανές ότι το 20 δεν μπορεί να εισαχθεί στη συγκεκριμένη θέση, αφού ο γονέας του κόμβου που βρίσκεται στη θέση αυτή έχει τιμή 18, η οποία είναι μικρότερη του 20. Συνεπώς, το 18 μετακινείται στη θέση του δεξιού παιδιού του και το νέο στοιχείο με τιμή κλειδιού 20 εισάγεται στη ρίζα του σωρού. 24

Διαγραφή στοιχείου από μέγιστο σωρό -1- Στο παρακάτω Σχήμα φαίνεται ένας μέγιστος σωρός με 5 στοιχεία: Αν από το σωρό αυτό διαγράψουμε το μεγαλύτερο στοιχείο, τότε ο σωρός θα έχει τη δομή που φαίνεται παρακάτω, αφού ο μέγιστος σωρός είναι ένα πλήρες δυαδικό δέντρο: 25

Διαγραφή στοιχείου από μέγιστο σωρό -2- Διαγραφή του μεγαλύτερου στοιχείου με τιμή κλειδιού 18: αν διαγράψουμε από τον μέγιστο σωρό που φαίνεται στο Σχήμα το μεγαλύτερο στοιχείο με τιμή κλειδιού 18 τότε ο σωρός που θα προκύψει θα πρέπει να έχει τη δομή που φαίνεται στο Σχήμα 26

Διαγραφή στοιχείου από μέγιστο σωρό -3- Η πρώτη μας κίνηση λοιπόν είναι να διαγράψουμε τον κόμβο (με τιμή κλειδιού 8) που βρίσκεται στη θέση 5 του σωρού και να τον εισάγουμε στη ρίζα, η οποία είναι άδεια μετά τη διαγραφή του κόμβου με τιμή κλειδιού 18. Στη συνέχεια ελέγχουμε αν το πλήρες δυαδικό δέντρο που προκύπτει είναι ταυτόχρονα και μέγιστο δέντρο. Στο συγκεκριμένο παράδειγμα αυτό δεν συμβαίνει, αφού το στοιχείο της ρίζας με τιμή κλειδιού 8 δεν είναι μεγαλύτερο από τα παιδιά της που έχουν τιμές κλειδιού 13 και 2. Άρα, το στοιχείο με τιμή κλειδιού 13 που βρίσκεται στη θέση 2 μετακινείται προς τα πάνω και συγκεκριμένα στη ρίζα, ενώ το στοιχείο της ρίζας εισάγεται στον κενό πλέον κόμβο της 2ης θέσης. 27

Πακέτο για τον ΑΤΔ Σωρός //filename : HeapADT.h -1- #define MaxElements 10 //το μέγιστο πλήθος των στοιχείων του σωρού typedef int HeapElementType; //ο τύπος δεδομένων κάθε στοιχείου του σωρού typedef struct { HeapElementType key; //int Data; } HeapNode; typedef struct { int Size; HeapNode Element[MaxElements+1]; } HeapType; typedef enum { FALSE, TRUE } boolean; 28

Πακέτο για τον ΑΤΔ Σωρός -2- void CreateMaxHeap(HeapType *Heap); boolean FullHeap(HeapType Heap); boolean EmptyHeap(HeapType Heap); void InsertMaxHeap(HeapType *Heap, HeapNode Item); void DeleteMaxHeap(HeapType *Heap, HeapNode *Item); 29

Πακέτο για τον ΑΤΔ Σωρός -3- void CreateMaxHeap(HeapType *Heap) /*Λειτουργία: Δημιουργεί ένα κενό σωρό. Επιστρέφει: Ένα κενό σωρό.*/ { (*Heap).Size = 0 } boolean FullHeap(HeapType Heap) /*Δέχεται: Ένα σωρό. Λειτουργία: Ελέγχει αν ο σωρός είναι γεμάτος. Επιστρέφει: TRUE αν ο σωρός είναι γεμάτος, FALSE διαφορετικά.*/ { return (Heap.Size == MaxElements) } 30

Πακέτο για τον ΑΤΔ Σωρός -4- boolean EmptyHeap(HeapType Heap) /*Δέχεται: Ένα σωρό Heap. Λειτουργία: Ελέγχει αν ο σωρός είναι κενός. Επιστρέφει: TRUE αν ο σωρός είναι κενός, FALSE διαφορετικά.*/ { return (Heap.Size == 0) } 31

Πακέτο για τον ΑΤΔ Σωρός -5- void InsertMaxHeap(HeapType *Heap, HeapNode Item) /*Δέχεται: Ένα σωρό Heap και ένα στοιχείο δεδομένου Item. Λειτουργία: Εισάγει το στοιχείο Item στο σωρό, αν ο σωρός δεν είναι γεμάτος. Επιστρέφει: Τον τροποποιημένο σωρό. Έξοδος: Μήνυμα γεμάτου σωρού αν ο σωρός είναι γεμάτος.*/ 32

Πακέτο για τον ΑΤΔ Σωρός -6- { } int hole; if (!FullHeap(*Heap)) { (*Heap).Size++; hole=(*heap).size; while (hole>1 && Item.key > Heap->Element[hole/2].key) { } (*Heap).Element[hole]= (*Heap).Element[hole/2]; hole=hole/2; (*Heap).Element[hole]=Item; 33

void DeleteMaxHeap(HeapType *Heap, HeapNode *Item) /*Δέχεται: Ένα σωρό Heap. { Πακέτο για τον ΑΤΔ Σωρός Λειτουργία: Ανακτά και διαγράφει το μεγαλύτερο στοιχείο του σωρού. Επιστρέφει: Το μεγαλύτερο στοιχείο Item (αυτό που θα διαγραφεί) του σωρού και τον τροποποιημένο σωρό.*/ int parent, child; κόμβου parent HeapNode last; boolean done; -7- // child δείχνει το μεγαλύτερο παιδί του //last ο τελευταίος κόμβος 34

Πακέτο για τον ΑΤΔ Σωρός -8- if (! EmptyHeap(*Heap)) { done = FALSE; (*Item) = (*Heap).Element[1]; //item το στοιχείο που θα διαγραφεί last = (*Heap).Element[(*Heap).Size]; (*Heap).Size --; parent = 1; child = 2; 35

Πακέτο για τον ΑΤΔ Σωρός -9- while (child<=(*heap).size &&!done) { if (child < (*Heap).Size) if (*Heap).Element[child].key < (*Heap).Element[child +1].key) child ++; if (last.key >= (*Heap).Element[child].key) done = TRUE; else { (*Heap).Element[parent] = (*Heap).Element[child]; //μετακινούμε το παιδί πάνω parent = child; //συνεχίζουμε με τα παιδιά του child = 2* child; } } (*Heap).Element[parent] = last; } else printf( Empty heap...\n ); } 36

Τέλος Ενότητας