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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

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

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

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

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

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

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

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

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

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

Γηάιεμε 17: Γπαδηθά Γέληξα

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

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

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

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

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 3 Δέντρα

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

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

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

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

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

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

ιαφάνειες παρουσίασης #10 (β)

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

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

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

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

Εισαγωγή ενός νέου στοιχείου. Επιλογή i-οστoύ στοιχείου : Εύρεση στοιχείου με το i-οστό μικρότερο κλειδί

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

ένδρα (tail, head) Γονέας Παιδί (ancestor, descendant) Φύλλο Εσωτερικός Κόµβος (leaf, non-leaf) που αποτελεί το γονέα του v.

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

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

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

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

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

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

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

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

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

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

Αναδρομικοί Αλγόριθμοι

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

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

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

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

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

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Εργαστήριο 2 Δυναμικές Δομές Δεδομένων Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

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

Insert(K,I,S) Delete(K,S)

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

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

AVL-trees C++ implementation

Διάλεξη 11: Δέντρα Ι Εισαγωγή σε Δενδρικές Δομές Δεδομένων

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

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

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

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

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

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

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

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

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

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

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

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

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

Transcript:

Διάλεξη 7: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δυαδικά Δένδρα Ένα δένδρο είναι δυαδικό αν όλοι οι κόμβοι του έχουν βαθμό 2. Ορισμός: Δυαδικό δένδρο λέγεται ένα δένδρο το οποίο : είτε είναι κενό, ή αποτελείται από μια ρίζα και δύο δυαδικά υπόδενδρα. Αναφερόμαστε στα δύο υπόδενδρα ως το αριστερό και το δεξιό υπόδενδρο. Το ύψος ενός δυαδικού δένδρου με n κόμβους μπορεί να είναι το 2 πολύ : n- (συνδεδεμένη λίστα) και το λιγότερο lg n. Ένα δυαδικό δένδρο είναι γεμάτο (full), αν κάθε εσωτερικός του κόμβος έχει δύο απογόνους. Ένα δυαδικό δένδρο είναι τέλειο (perfect), αν είναι γεμάτο και όλοι του οι κόμβοι που βρίσκονται στο ίδιο επίπεδο έχουν το ίδιο βάθος. 3 floor(lg 4)= 2 h=2 2 3 5 8 3 3 7 9 2 5 8 3 FULL PERFECT

Παραδείγματα Δυαδικά Δένδρα Παραδείγματα δυαδικών δένδρων

Υλοποίηση Δυαδικών Δένδρων Αφού κάθε κόμβος σε ένα δυαδικό δένδρο έχει το πολύ δύο παιδιά, μπορούμε να κρατούμε δείκτες στο καθένα από αυτά. Δηλαδή, ένας κόμβος μπορεί να υλοποιηθεί ως μια εγγραφή NODE με τρία πεδία (παρόμοια με κόμβο διπλά συνδεδεμένης λίστας).. val, όπου αποθηκεύουμε την πληροφορία του κόμβου, 2. left, τύπου pointer, ο οποίος δείχνει το αριστερό, υπόδενδρο που ριζώνει στον συγκεκριμένο κόμβο, και 3. right, τύπου pointer, ο οποίος δείχνει το δεξιό υπόδενδρο που ριζώνει στον συγκεκριμένο κόμβο. typedef struct node { int val; val struct node *left; struct node *right; NODE; Έτσι, ένα δυαδικό δένδρο υλοποιείται ως ένας δείκτης στη ρίζα του δένδρου, δηλαδή δείκτης σε εγγραφή τύπου NODE. NODE *root;

Δυαδικά Δένδρα Αναζήτησης ΔΔΑ (Binary Search Trees) Το πιο σημαντικό πλεονέκτημα της χρήσης δυαδικών δένδρων η αποδοτική αναζήτηση σε ένα σύνολο στοιχείων Υποθέτουμε την ύπαρξη μιας σχέσης στο σύνολο των στοιχείων που επεξεργαζόμαστε, έστω τη σχέση < πάνω στο σύνολο των ακεραίων. Ένα δυαδικό δένδρο αναζήτησης (ΔΔΑ) είναι ένα δυαδικό δένδρο κάθε κόμβος u του οποίου ικανοποιεί τα εξής:. τα κλειδιά του αριστερού υποδένδρου του u είναι μικρότερα από το κλειδί του u 2. τα κλειδιά του δεξιού υποδένδρου του u είναι μεγαλύτερα (ή ίσο) από το κλειδί του u.

Παράδειγμα Κτισίματος ενός ΔΔΑ 37 37 37 37 24 24 42 24 42 37 37 24 42 24 42 40 40 0

Κτίζοντας ένα ΔΔΑ Δένδρο με τα ίδια στοιχεία τοποθετημένα με διαφορετική σειρά: 0, 42,, 24 37, 40. 42 24 0 37 Ποιο είναι το χειρότερο σενάριο? Οι τιμές εισόδου φθάνουν με την ακόλουθη σειρά 0,42,40,37,24, (φθίνουσα σειρά) ή,24,37,40,42,0 (αύξουσα σειρά) Αυτές οι δυο τιμές εισόδου παράγουν μια συνδεμένη λίστα 40

Εύρεση Μεγέθους ΔΔΑ Αναδρομική Υλοποίηση int size(node *root) { // τερματίζουμε αν βρήκαμε κόμβο φύλλο if (root == NULL) { return 0; return (size(root->left) + + size(root->right)); 3 2 5 8 3 7 9 Σημειώστε ότι η μη-αναδρομική υλοποίηση χρειάζεται την χρήση μιας βοηθητικής δομής (π.χ. στοίβας) Όμως η αναδρομική υλοποίηση είναι πιο εύκολα κατανοητή

Διαδικασία Εύρεσης Στοιχείου FindNode() Απλή αναδρομική στρατηγική: συγκρίνουμε το στοιχείο που μας ενδιαφέρει α με το στοιχείο της ρίζας του δένδρου β (αν υπάρχει) και. αν α=β, σταματούμε, 2. αν α<β, προχωρούμε στο αριστερό υπόδενδρο, 3. αν α>β προχωρούμε στο δεξιό υπόδενδρο. NODE *FindNode(NODE *root, int val) { if (root == NULL) return NULL; // το στοιχείο δεν βρέθηκε 2 else if (root->val == val) // το στοιχείο βρέθηκε! return root; else { // ακόμα δεν βρέθηκε το στοιχείο if (val < root->val) return FindNode(root->left, val); else return FindNode(root->right, val); Χείριστη περίπτωση Ο(n) (εάν έχουμε λίστα) 3 5 8 3 7 9

Διαδικασία Εισαγωγής Κόμβου InsertNode() NODE *InsertNode(NODE *root, int val){ if (root == NULL) { // εισαγωγή κόμβου root = (NODE *) malloc(sizeof(node)); if (root==null) { printf("out of Memory!"); exit(); else { root->val = val; root->left = NULL; root->right = NULL; root if (val < root->val) // εισαγωγή αριστερά root->left = InsertNode(root->left, val); else // εισαγωγή δεξιά root->right = InsertNode(root->right, val); 2 3 5 8 3 7 9 return root;

Εξαγωγή του μικρότερου κόμβου DeleteMin(). Ακολουθούμε τους αριστερούς δείκτες όσο μπορούμε, φθάνοντας στον κόμβο με το μικρότερο στοιχείο, u. 2. Βρίσκουμε τον πατέρα v του u και αλλάζουμε τον αριστερό δείκτη του v ώστε να δείχνει στο δεξιό παιδί του u. v u 45 45 34 7 7 3 3

Εξαγωγή του μικρότερου κόμβου NODE *deletemin(node *root) { NODE *p; if (root == NULL) { // μικρότερο στοιχείο δεν βρέθηκε return NULL; // πχ αν είναι κενό το δένδρο else if (root->left == NULL) { // φτάσαμε στο μικρότερο 3 p = root; root = root->right; free(p); 7 else {// αναδρομική προχώρησε προς τα αριστερά root->left = deletemin(root->left); return root; 5 8 3 9

Διαγραφή κόμβου i (μόνο η ιδέα) Για να αφαιρέσουμε ένα κλειδί X από ένα ΔΔΑ:. Βρίσκουμε τον κόμβο u που περιέχει το X. 2. Πριν διαγράψουμε τον u βρίσκουμε τον μικρότερο (από δεξιά) απόγονο του (τον οποίο ονομάζουμε v). 3. Η ιδέα είναι ότι ο v πρέπει να αντικαταστήσει τον u! H υλοποίηση γίνεται πιο απλή χρησιμοποιώντας επαναληπτικούς βρόγχους παρά αναδρομή. u v

Σύγκριση Δυαδικών Δένδρων Να γραφεί μια συνάρτηση η οποία να επιστρέφει αν δυο δυαδικά δένδρα είναι τα ίδια και 0 στην αντίθετη περίπτωση int sametree(node *a, NODE *b) { // και τα δυο δένδρα είναι κενά => άρα επιστρέφουμε TRUE if (a==null && b==null) return ; // και τα δυο δένδρα δεν είναι κενά συγκρίνουμε τις ρίζες τους else if (a!=null && b!=null) { return( (a->data == b->data) && 3 3 sametree(a->left, b->left) && 5 8 3 8 sametree(a->right, b->right) ); 7 9 7 9 5 3 // το ένα εκ των δυο υπό-δένδρων είναι κενό => επιστρέφουμε FALSE else return 0;