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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Λίστες παράλειψης (skip lists)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AVL-trees C++ implementation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ισοζυγισµένο έντρο (AVL Tree)

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

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

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

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

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Λίστες Κεφάλαιο 3 (3.3, 3.4, 3.7) Ε. Μαρκάκης Επικ. Καθηγητής

Quicksort. Επιμέλεια διαφανειών: Δ. Φωτάκης Μικροαλλαγές: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

Κατηγορίες Συμπίεσης. Συμπίεση με απώλειες δεδομένων (lossy compression) π.χ. συμπίεση εικόνας και ήχου

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

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

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

Ν. Μ. Μισυρλής. Τµήµα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστήµιο Αθηνών. Καθηγητής: Ν. Μ. Μισυρλής 29 Μαΐου / 18

υαδικά δέντρα αναζήτησης

Συγκρίσιμα Αντικείμενα (comparable)

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

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

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

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

Μπαλτάς Αλέξανδρος 21 Απριλίου 2015

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

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

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

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

Δοµές Δεδοµένων. 5η Διάλεξη Λίστες και αρχές ανάλυσης αλγορίθµων. Ε. Μαρκάκης

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

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΛΥΣΗ ΣΤΗΝ ΕΥΤΕΡΗ ΑΣΚΗΣΗ

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

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

Transcript:

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

Περίληψη Δέντρα Δυαδικής Αναζήτησης (ΔΔΑ) Υλοποιήσεις εισαγωγής και αναζήτησης Χαρακτηριστικά επιδόσεων ΔΔΑ Εισαγωγή στη ρίζα ΔΔΑ Υλοποιήσεις άλλων λειτουργιών σε ΔΔΑ: Επιλογή k-οστού µικρότερου Διαµέριση Αφαίρεση στοιχείου Ένωση 2 δέντρων Δοµές Δεδοµένων 13-2

Δέντρα δυαδικής αναζήτησης Ανακεφαλαίωση: Και στην ακολουθιακή και στη δυαδική αναζήτηση κάποιες λειτουργίες θα έχουν κόστος Ο(Ν) Χρήση πίνακα ή διατεταγµένης λίστας δεν είναι η καλύτερη λύση Βελτιώσεις: Χρήση ρητής δοµής δέντρου για την υλοποίηση του πίνακα συµβόλων Αναδροµικές κλήσεις στα υποδέντρα Πολυπλοκότητα εξαρτάται από το ύψος του δέντρου Άρα Ο(logN) αν το δέντρο είναι «ισοζυγισµένο» Δοµές Δεδοµένων 13-3

Δέντρα δυαδικής αναζήτησης Ορισµός Δέντρου Δυαδικής Αναζήτησης (ΔΔΑ) Δυαδικό δέντρο µε κλειδιά σε κάθε εσωτερικό κόµβο Κάθε εσωτερικός κόµβος έχει ακριβώς 2 παιδιά Για κάθε εσωτερικό κόµβο Οι κόµβοι του αριστερού υποδέντρου έχουν µικρότερα κλειδιά Οι κόµβοι του δεξιού υποδέντρου έχουν µεγαλύτερα κλειδιά Κλάση ΔΔΑ Ορίζει δοµή κόµβων και ρίζα, αρχικά κενή class ST { private class Node { ITEM item; Node l, r; //αναφορές σε αριστερό και δεξί υποδέντρο Node(ITEM x) { item = x; l=null; r=null; } } private Node head; //δείκτης στη ρίζα του δέντρου ST(int maxn) { head = null; } Δοµές Δεδοµένων 13-4

Δέντρα δυαδικής αναζήτησης Τα Δέντρα Δυαδικής Αναζήτησης ΔΕΝ είναι σωροί!!! Μόνη οµοιότητα µεταξή ΔΔΑ και σωρών είναι ότι και οι 2 δοµές αναπαρίστανται ως δυαδικά δέντρα Η ιδιότητα που πρέπει να ικανοποιούν τα κλειδιά σε ένα ΔΔΑ δεν σχετίζεται µε την ιδιότητα που πρέπει να ισχύει σε ένα σωρό Τα ΔΔΑ µας βοηθούν κυρίως στην αναζήτηση Οι σωροί µας βοηθούν σε προβλήµατα που αφορούν ουρές προτεραιότητας Δοµές Δεδοµένων 13-5

Δέντρα δυαδικής αναζήτησης 56 26 200 18 28 213 12 24 35 Δοµές Δεδοµένων 13-6

Δέντρα δυαδικής αναζήτησης Υλοποίηση αναζήτησης: Δες αν το κλειδί που ψάχνουµε είναι ίσο µε το κλειδί της ρίζας Αν όχι αναδροµική κλήση στο αριστερό ή στο δεξί υποδέντρο. Εγγύηση ότι αν το κλειδί είναι µικρότερο από το κλειδί της ρίζας, αρκεί να ψάξουµε στο αριστερό υποδέντρο και αντίστροφα Υλοποίηση εισαγωγής (ως φύλλο): Προχωράµε στο δέντρο µε παρόµοιο τρόπο µέχρι να βρούµε τη σωστή θέση για να διατηρηθεί η ιδιότητα του ΔΔΑ Εισαγωγή στη θέση κάποιου εξωτερικού κόµβου (ως φύλλο) Μπορούµε να χρησιµοποιήσουµε και άλλες προσεγγίσεις Δοµές Δεδοµένων 13-7

Δέντρα δυαδικής αναζήτησης Παράδειγµα: insert 33 56 26 200 18 28 213 12 24 35 33 Δοµές Δεδοµένων 13-8

Δέντρα δυαδικής αναζήτησης Παράδειγµα: insert 33 56 26 200 18 28 213 12 24 35 33 Δοµές Δεδοµένων 13-9

Δέντρα δυαδικής αναζήτησης Τάξη ΔΔΑ Αναδροµική εισαγωγή και αναζήτηση private Node insertr(node h, ITEM x) { if (h == null) return new Node(x); if (less(x.key(), h.item.key())) h.l = insertr(h.l, x); else h.r = insertr(h.r, x); return h; } void insert(item x) { head = insertr(head, x); } private ITEM searchr(node h, KEY v) { if (h == null) return null; if (equals(v, h.item.key())) return h.item; if (less(v, h.item.key())) return searchr(h.l, v); else return searchr(h.r, v); } ITEM search(key key) { return searchr(head, key); } Δοµές Δεδοµένων 13-10

Δέντρα δυαδικής αναζήτησης Παραδείγµατα αναζήτησης H: καταλήγουµε σε εσωτερικό κόµβο Μ: καταλήγουµε σε εξωτερικό κόµβο (null) Παράδειγµα εισαγωγής M: ανεπιτυχής αναζήτηση Εισαγωγή νέου κλειδιού Χειρισµός διπλών κλειδιών Δεν εισάγονται συνεχόµενα Παράδειγµα: 3 εισαγωγές του A Συνεχίζουµε την αναζήτηση Σταµατάµε µόνο όταν βρούµε null Μπορούµε να εντοπίζουµε όλα τα διπλά κλειδιά Δοµές Δεδοµένων 13-11

Δέντρα δυαδικής αναζήτησης Παράδειγµα κατασκευής Δυαδικού Δέντρου Αναζήτησης µε διαδοχικές εισαγωγές Δοµές Δεδοµένων 13-12

Δέντρα δυαδικής αναζήτησης Απλή επεξεργασία ΔΔΑ µε διάσχιση Παράδειγµα 1: καταµέτρηση του αριθµού των κόµβων Αρκεί µία διάσχιση του δέντρου, π.χ. προδιατεταγµένη Ή θα µπορούσαµε να έχουµε έναν µετρητή που να αυξάνεται σε κάθε εισαγωγή (eager approach) private int countr(node h) { if (h == null) return 0; return 1 + countr(h.l) + countr(h.r); } int count() { return countr(head); } Δοµές Δεδοµένων 13-13

Δέντρα δυαδικής αναζήτησης Απλή επεξεργασία ΔΔΑ µε διάσχιση Παράδειγµα 2: ταξινοµηµένη εκτύπωση Έστω ότι η tostring της ΙΤΕΜ επιστρέφει την τιµή του κλειδιού Θέλουµε να τυπώσουµε τα κλειδιά σε αύξουσα σειρά Αρκεί να κάνουµε µία ενδοδιατεταγµένη διάσχιση private String tostringr(node h) { if (h == null) return ""; String s = tostringr(h.l); s += h.item.tostring() + "\n ;//παίζει το ρόλο της visit() s += tostringr(h.r); return s; } public String tostring() { return tostringr(head); } Δοµές Δεδοµένων 13-14

Δέντρα δυαδικής αναζήτησης Μη αναδροµικοί αλγόριθµοι ΔΔΑ Χρήση βρόχου αντί αναδροµής για εισαγωγή Αρχικά έχουµε αναζήτηση και µετά εισαγωγή public void insert(item x) { KEY key = x.key(); if (head == null) { head = new Node(x); return; } Node p = head, q = p; while (q!= null) if (less(key, q.item.key())) { p = q; q = q.l; } else { p = q; q = q.r; }//ο q ενα επιπεδο κάτω από p if (less(key, p.item.key())) p.l = new Node(x); else p.r = new Node(x); } Δοµές Δεδοµένων 13-15

Χαρακτηριστικά επιδόσεων ΔΔΑ Τα ΔΔΑ έχουν δοµή παρόµοια µε τη λειτουργία της Quicksort Η ρίζα παίζει το ρόλο του pivot της Quicksort Όλα τα στοιχεία στο αριστερό υποδέντρο είναι µικρότερα της ρίζας Όλα τα στοιχεία στο δεξιό υποδέντρο είναι µεγαλύτερα της ρίζας Στη Δυαδική αναζήτηση µε ταξινοµηµένο πίνακα είχαµε: Αναζήτηση: O(logN) Εισαγωγή: Ο(Ν) χειρότερη και µέση περίπτωση Στα ΔΔΑ οι επιδόσεις εξαρτώνται από το σχήµα του δέντρου (συγκεκριµένα από το ύψος) Πολυπλοκότητα εισαγωγών/αναζητήσεων: Ο(h), όπου h το ύψος του δέντρου Το ύψος µπορεί να είναι από Ο(lοgN) έως Ο(N) Δοµές Δεδοµένων 13-16

Χαρακτηριστικά επιδόσεων ΔΔΑ Χειρότερη περίπτωση: Ν συγκρίσεις! Δέντρα που εκφυλίζονται σε λίστες Εµφανίζονται όταν τα κλειδιά είναι ήδη ταξινοµηµένα (όπως και στην Quicksort) Εµφανίζονται και σε άλλες διατάξεις των κλειδιών Δοµές Δεδοµένων 13-17

Χαρακτηριστικά επιδόσεων ΔΔΑ Όµως κατά µέσο όρο µε τυχαία κλειδιά: Επιτυχείς αναζητήσεις: αναζητήσεις όπου αυτό που ψάχνουµε υπάρχει στη δοµή µας Ανεπιτυχείς αναζητήσεις: όταν δεν υπάρχει αυτό που ψάχνουµε Ιδιότητα 1: Η επιτυχής αναζήτηση απαιτεί κατά µέσο όρο 2lnN = 1.39lοgN = Ο(logN) συγκρίσεις Ανάλυση παρόµοια µε αυτή της Quicksort Βασισµένη στον υπολογισµό της εσωτερικής διαδροµής του δέντρου Υπενθύµιση: µήκος εσωτερικής διαδροµής = άθροισµα των επιπέδων όλων των εσωτερικών κόµβων Αν όλοι οι κόµβοι είναι ισοπίθανοι, τότε µέση πολυπλοκότητα = µέσο µήκος εσωτερικής διαδροµής Μέσο µήκος εκφράζεται µέσω αναδροµικής εξίσωσης παροµοιας µε την ανάλυση µέσης περίπτωσης της Quicksort Δοµές Δεδοµένων 13-18

Χαρακτηριστικά επιδόσεων ΔΔΑ Όµως κατά µέσο όρο µε τυχαία κλειδιά: Επιτυχείς αναζητήσεις: αναζητήσεις όπου αυτό που ψάχνουµε υπάρχει στη δοµή µας Ανεπιτυχείς αναζητήσεις: όταν δεν υπάρχει αυτό που ψάχνουµε Ιδιότητα 2: Η ανεπιτυχής αναζήτηση και η εισαγωγή έχουν µέσο κόστος περίπου 2 + 1.39lοgN = Ο(logN) Αρκεί να υπολογίσουµε το µέσο µήκος εξωτερικής διαδροµής Ορίζεται σε αναλογία µε το µήκος εσωτερικής διαδροµής Από Κεφ. 5: µήκος εξωτερικής = µήκος εσωτερικής + 2Ν Έχουµε Ν+1 ισοπίθανους εξωτερικούς κόµβους Κόστος = 1/(Ν+1) *(µήκος εξωτερικής διαδροµής) Κόστος αναζήτησης 39% υψηλότερο από τη δυαδική αναζήτηση σε πίνακα Κερδίζουµε όµως σηµαντικά στο κόστος της εισαγωγής! Δοµές Δεδοµένων 13-19

Χαρακτηριστικά επιδόσεων ΔΔΑ Κατασκευή Αναζήτηση Ν ΑΠ ΤΛ ΔΑ ΔΔΑ ΑΠ ΤΛ ΔΑ ΔΔΑ 1250 0 81 90 4 123 250 5 6 2500 0 291 356 8 457 977 9 11 5000 1 1260 1445 19 1853 4077 18 24 12500 2 10848 10684 53 12749 34723 54 69 25000 169 174 50000 407 431 100000 900 995 200000 2343 2453 Δοµές Δεδοµένων 13-20

Εισαγωγή στη ρίζα ΔΔΑ Η εισαγωγή που είδαµε γίνεται σε εξωτερικό κόµβο Πολλές φορές θέλουµε η εισαγωγή να γίνεται στη ρίζα Παραδείγµατα: Μία καινούρια σελίδα µπορεί να γίνει γρήγορα δηµοφιλής, οι µηχανές αναζήτησης θα πρέπει να την ανακτούν σχετικά γρήγορα Εµπορικές συναλλαγές στο Internet: καλύτερα να είναι πιο πάνω στο δέντρο οι πιο πρόσφατες συναλλαγές ή οι ενεργές συναλλαγές Δοµές Δεδοµένων 13-21

Εισαγωγή στη ρίζα ΔΔΑ Απόπειρα υλοποίησης εισαγωγής στη ρίζα αντί στα φύλλα Ο νέος κόµβος γίνεται ρίζα Συγκρίνουµε τον νέο κόµβο µε την παλιά ρίζα Μεγαλύτερος? η παλιά ρίζα θα µπει αριστερά του Μικρότερος? η παλιά ρίζα θα µπει δεξιά του Ο νέος κόµβος όµως δεν είναι στο σωστό σηµείο! Μεγαλύτερος: ίσως υπάρχουν µικρότεροι στο δεξί υποδέντρο Μικρότερος: ίσως υπάρχουν µεγαλύτεροι στο αριστερό υποδέντρο Σωστή υλοποίηση: µε διαδοχικές περιστροφές Δοµές Δεδοµένων 13-22

Εισαγωγή στη ρίζα ΔΔΑ Περιστροφή (Rotation) σε ΔΔΑ Αντιµετάθεση της ρίζας µε ένα από τα παιδιά της Δεξιά περιστροφή: αριστερό παιδί γίνεται ρίζα, η ρίζα πάει στο δεξιό υποδέντρο Δεξιό υποδέντρο του αριστερού παιδιού: πρέπει να γίνει αριστερό υποδέντρο της παλιάς ρίζας Αριστερή περιστροφή: δεξί παιδί γίνεται ρίζα, η ρίζα πάει στο αριστερό υποδέντρο Διατηρεί τη σχετική θέση των κλειδιών των παιδιών Δεξιά περιστροφή Αριστερή περιστροφή Δοµές Δεδοµένων 13-23

Εισαγωγή στη ρίζα ΔΔΑ Δεξιά περιστροφή (παίρνει όρισµα τη ρίζα ενός (υπο-)δέντρου) private Node rotr(node h) { Node x = h.l; h.l = x.r; x.r = h; return x; } Αριστερή περιστροφή private Node rotl(node h) { Node x = h.r; h.r = x.l; x.l = h; return x; } Δεξιά περιστροφή Αριστερή περιστροφή Δοµές Δεδοµένων 13-24

Εισαγωγή στη ρίζα ΔΔΑ Πώς λειτουργεί η εισαγωγή στη ρίζα; Αρχικά κατεβαίνουµε µέχρι τα φύλλα Εισάγουµε το κλειδί στο σωστό σηµείο ως φύλλο Και ξεκινάµε περιστροφές Αν ο κόµβος είναι σε αριστερό υποδέντρο, δεξιά περιστροφή Αν είναι σε δεξί υποδέντρο, αριστερή περιστροφή Κάθε περιστροφή κάνει τον κόµβο ρίζα κάποιου υποδέντρου Τελικά το κλειδί φτάνει µέχρι τη ρίζα Παράδειγµα: εισαγωγή του G Ιδιότητες εισαγωγής στη ρίζα Οι πιο πρόσφατες εισαγωγές είναι κοντά στη ρίζα Μπορούµε να κάνουµε το ίδιο και στις αναζητήσεις Εντοπίζουµε το κλειδί και µετά το φέρνουµε στη ρίζα Οι πιο πρόσφατες αναζητήσεις είναι κοντά στη ρίζα Δοµές Δεδοµένων 13-25

Εισαγωγή στη ρίζα ΔΔΑ Υλοποίηση εισαγωγής στη ρίζα Εισάγουµε πρώτα τον νέο κόµβο στο κατάλληλο υποδέντρο (ως φύλλο όπως και πριν) Ολοκληρώνουµε µε κατάλληλες περιστροφές private Node insertt(node h, ITEM x) { if (h == null) return new Node(x); if (less(x.key(), h.item.key())) { h.l = insertt(h.l, x); //αναδροµικά το x ρίζα του h.l h = rotr(h); } //δεξιά περιστροφή για να έρθει στη ρίζα else { h.r = insertt(h.r, x); h = rotl(h); } return h; } public void insert(item x) { head = insertt(head, x); } Δοµές Δεδοµένων 13-26

Εισαγωγή στη ρίζα ΔΔΑ Παράδειγµα κατασκευής Δυαδικού Δέντρου Αναζήτησης µε διαδοχικές εισαγωγές στη ρίζα: Εισαγωγή των A S E R C H I N G X M P L Δοµές Δεδοµένων 13-27

Υλοποιήσεις άλλων λειτουργιών Προβλήµατα Επιλογής (selection): Εύρεση κόµβου µε το k-οστό µικρότερο κλειδί Μετράµε τους κόµβους ανά υποδέντρο Απαιτεί ύπαρξη µετρητή σε κάθε κόµβο: µετρά πόσους κόµβους έχει το υποδέντρο µε ρίζα τον κόµβο Η εισαγωγή και η αφαίρεση πρέπει να ενηµερώνουν τον µετρητή! Μειονέκτηµα αν γίνονται πολλές εισαγωγές και αφαιρέσεις Εναλλακτικά: µπορούµε να έχουµε µια µέθοδο count(h) για να µετρά τον αριθµό κόµβων του υποδέντρου που ξεκινά από το h Αναδροµή: Έστω ότι το αριστερό υποδέντρο έχει t κλειδιά Αν k-1 < t ψάξε το k-οστό κλειδί στα αριστερά Αν k-1 > t ψάξε το (k-t-1)-οστό κλειδί στα δεξιά Αν k-1 = t τότε το k-οστό κλειδί είναι στη ρίζα Δοµές Δεδοµένων 13-28

Υλοποιήσεις άλλων λειτουργιών Επιλογή k-οστού µικρότερου κόµβου private ITEM selectr(node h, int k) { //για το k-οστό µικρότερο, το όρισµα πρέπει να είναι k-1 if (h == null) return null; int t = (h.l == null)? 0 : h.l.n; /*το πεδίο Ν σε κάθε κόµβο δηλώνει το µέγεθος του υποδέντρου µε ρίζα τον κόµβο*/ if (t > k) return selectr(h.l, k); if (t < k) return selectr(h.r, k-t-1); return h.item; } ITEM select(int k) { return selectr(head, k); } Δοµές Δεδοµένων 13-29

Υλοποιήσεις άλλων λειτουργιών Διαµέριση στον k-οστό κόµβο Στόχος: Αναδιάταξη του δέντρου ώστε να µπει το k-οστό µικρότερο στοιχείο στη ρίζα Αρχικά εντοπίζουµε τον k-οστό κόµβο Στη συνέχεια τον φέρνουµε στη ρίζα µε περιστροφές Παρόµοια τεχνική µε την εισαγωγή στη ρίζα Προσοχή: στο βιβλίο λείπουν 2 εκχωρήσεις Node partr(node h, int k) {// µε όρισµα k πάει το (k+1)-οστό στη ρίζα int t = (h.l == null)? 0 : h.l.n; if (t > k) { h.l = partr(h.l, k); h = rotr(h); } if (t < k) { return h; } h.r = partr(h.r, k-t-1); h = rotl(h); } Δοµές Δεδοµένων 13-30

Υλοποιήσεις άλλων λειτουργιών Διαµέριση στον k-οστό κόµβο Παράδειγµα: Διαµέριση µε βάση το 5 ο στοιχείο Αρχικά εντοπίζουµε το Μ ως 5 ο στοιχείο Στη συνέχεια το φέρνουµε στη ρίζα µε διαδοχικές περιστροφές Ανάλογη µε τη µέθοδο partition της Quicksort Εδώ pivot είναι το στοιχείο Μ Δοµές Δεδοµένων 13-31

Υλοποιήσεις άλλων λειτουργιών Αφαίρεση κόµβου από ΔΔΑ Υπάρχουν πολλοί πιθανοί τρόποι λύσης Αναδροµική αφαίρεση από το κατάλληλο υποδέντρο Τι γίνεται αν ο κόµβος είναι στη ρίζα ενός υποδέντρου; Πώς πρέπει να ενώσουµε τα 2 υποδέντρα ώστε να αποκατασταθεί η ιδιότητα των ΔΔΑ; Πολλές επιλογές. Π.χ. µία λύση είναι: Εντοπίζουµε το µικρότερο κλειδί του δεξιού υποδέντρου (διαµέριση µε k=0) Το φέρνουµε στη ρίζα µε περιστροφές Θέτουµε ως αριστερό παιδί του το αριστερό υποδέντρο Δοµές Δεδοµένων 13-32

Υλοποιήσεις άλλων λειτουργιών Υλοποίηση αφαίρεσης κόµβου από ΔΔΑ Προσοχή: στο βιβλίο λείπουν 2 εκχωρήσεις void remove(key v) { remover(head, v); } private Node remover(node h, KEY v) { if (h == null) return null; KEY w = h.item.key(); if (less(v, w)) h.l = remover(h.l, v); if (less(w, v)) h.r = remover(h.r, v); if (equals(v, w)) h = joinlr(h.l, h.r); return h; } private Node joinlr(node a, Node b) { if (b == null) return a; b = partr(b, 0); //διαµέριση µε k=0 b.l = a; //το a θα γίνει το αριστερό υποδέντρο του b return b; } Δοµές Δεδοµένων 13-33

Υλοποιήσεις άλλων λειτουργιών Θα µπορούσαµε εναλλακτικά να βάλουµε ως ρίζα το µεγαλύτερο στοιχείο από το αριστερό υποδέντρο Το δέντρο που προκύπτει µε τέτοιες προσεγγίσεις δεν είναι «εντελώς τυχαίο» Αν στη συνέχεια εφαρµοστούν ζεύγη από αφαιρέσεις και εισαγωγές τυχαίων δεδοµένων, το δέντρο δεν θα είναι ισορροπηµένο (µέσο ύψος περίπου N) Ράθυµη αφαίρεση: υλοποίηση αφαίρεσης µε χρήση ενός δείκτη για το αν είναι ενεργός ένας κόµβος Δεν αφαιρούµε, απλά µαρκάρουµε τον κόµβο ως µη ενεργό Στην αναζήτηση αγνοούµε τους µαρκαρισµένους κόµβους Περιοδικά ανακατασκευάζουµε τη δοµή Δοµές Δεδοµένων 13-34

Υλοποιήσεις άλλων λειτουργιών Ένωση ή συγχώνευση ΔΔΑ Έστω ότι έχουµε τα ΔΔΑ Α και Β και θέλουµε να τα ενώσουµε σε ένα δέντρο Σε αντίθεση µε την joinlr της αφαίρεσης, τώρα δεν ισχύει ότι όλα τα στοιχεία του Α είναι µικρότερα ή ίσα από τα στοιχεία του Β Και εδώ υπάρχουν πολλοί τρόποι υλοποίησης Οι προφανείς λύσεις δεν είναι ικανοποιητικές Παράδειγµα: διάσχιση του Α και εισαγωγή όλων των κόµβων του Α στο Β Worst case: O(N 2 ) Αναδροµική συγχώνευση γραµµικού χρόνου: Εισάγουµε τη ρίζα του Α ως ρίζα του Β Συγχωνεύουµε το αριστερό υπόδενδρο του Β µε το αριστερό του Α Συγχωνεύουµε το δεξί υπόδενδρο του Β µε το δεξί του Α Κάθε κόµβος οδηγεί σε µία µόνο αναδροµική κλήση Δοµές Δεδοµένων 13-35

Υλοποιήσεις άλλων λειτουργιών Υλοποίηση αναδροµικής συγχώνευσης private Node joinr(node a, Node b) { if (b == null) return a; if (a == null) return b; insertt(b, a.item); b.l = joinr(a.l, b.l); b.r = joinr(a.r, b.r); return b; } public void join(st b) { head = joinr(head, b.head); } Παράδειγµα Συγχώνευση του αριστερού δέντρου στο δεξί Δοµές Δεδοµένων 13-36

Υλοποιήσεις άλλων λειτουργιών Συµπεράσµατα: Μην ξεχνάµε να ενηµερώνουµε και τον µετρητή για το µέγεθος κάθε υποδέντρου, σε εισαγωγές, αφαιρέσεις, περιστροφές, κτλ ΔΔΑ αρκετά αποδοτική υλοποίηση πίνακα συµβόλων όταν ο χώρος δεν είναι πρόβληµα (απαιτήσεις σε µνήµη είναι λόγω των συνδέσµων) Οι βασικές λειτουργίες αναζήτησης και εισαγωγής έχουν καλές επιδόσεις κατά µέσο όρο Πρόβληµα όταν τα δέντρα αρχιζουν να γίνονται µη ισορροπηµένα Υπάρχουν όµως µέθοδοι για την αναδιοργάνωση και τη µείωση του ύψους Δοµές Δεδοµένων 13-37