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

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

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

ρίζα E F G H I J επίπεδο 1

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 6: ΑΤΔ Δένδρο, ΑΤΔ Δυαδικό Δένδρο Αναζήτησης (ΔΔΑ)

AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962

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

Δέντρα (Trees) - Ιεραρχική Δομή

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

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

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

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εκτενείς Δομές Δεδομένων

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

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

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

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

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

Ισοζυγισμένα υαδικά έντρα Αναζήτησης

Εκτενείς Δομές Δεδομένων

έντρα Πολλαπλής ιακλάδωσης και (a, b)- έντρα

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

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

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

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

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

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

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

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

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δημιουργία Δυαδικών Δέντρων Αναζήτησης

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

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

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

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

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

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

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

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

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

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

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

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

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

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

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

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

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

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

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

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

Λεξικό, Union Find. ιδάσκοντες: Σ. Ζάχος,. Φωτάκης Επιμέλεια διαφανειών:. Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

Πρόβληµα (ADT) Λεξικού. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Λεξικό, Union - Find 2

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

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

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

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

Transcript:

υαδικά έντρα Αναζήτησης (Binary Search Trees) Ορισµός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόµενα στο αριστερό υποδέντρο του t είναι µικρότερα (αριθµητικά ή αλφαβητικά) από το περιεχόµενο της ρίζαςτου t (ii) όλα τα περιεχόµενα στο δεξί υποδέντρο του t είναι µεγαλύτερα απότοπεριεχόµενοτηςρίζαςτου t (iii) το αριστερό και το δεξί υποδέντρο του t είναι επίσης δυαδικά δέντρα αναζήτησης Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες: ηµιουργία : ηµιουργεί ένα κενό Α 2 Κενό : Ελέγχει αν το Α είναι κενό 3 Αναζήτηση : Επιστρέφει τη θέση του κόµβου µε δεδοµένο περιεχόµενο 4 Εισαγωγή : Εισάγει ένα κόµβο στο Α έτσι ώστε το προκυπτόµενο δέντρο να είναι ένα Α 5 ιαγραφή : ιαγράφει ένα κόµβο µε δεδοµένο περιεχόµενο έτσι ώστε το προκυπτόµενο δέντρο να είναι ένα Α Αναζήτηση Αναδροµικό υποπρόγραµµα void anazitisi_dentrou(typos_deikti riza, typos_stoixeiou stoixeio, typos_deikti *prosorinos, int *vrethike) Aντο περιεχόµενο ενός κόµβου του A rizaείναι ίσο µε stoixeioτοτετo *prosorinosδείχνει τον κόµβο αυτό και η *vrethike είναι, αλλιώς το *vrethike είναι και τo *prosorinos είναι NULL */ void anazitisi_dentrou(typos_deikti riza, typos_stoixeiou stoixeio, typos_deikti *prosorinos, int *vrethike){ if (keno_dentro(riza)) { *prosorinos = NULL; *vrethike = ; else if (stoixeio == riza->dedomena){// βρέθηκε *prosorinos = riza; *vrethike = ; else if (stoixeio < riza->dedomena ) /* αναζήτηση αριστερού υπόδεντρου */ anazitisi_dentrou(riza->apaidi, stoixeio, prosorinos, vrethike); else /* αναζήτηση δεξιού υπόδεντρου */ anazitisi_dentrou(riza->dpaidi, stoixeio, prosorinos, vrethike); Πολυπλοκότητα Ο(h), όπου h το ύψος του δένδρου

Μη Αναδροµικό υποπρόγραµµα Πολυπλοκότης : Ο(h): void anazitisi_dentrou(typos_deikti riza, typos_stoixeiou stoixeio, typos_deikti *prosorinos, int *vrethike){ *prosorinos = riza; *vrethike = ; while (!(*vrethike) && ((*prosorinos!=null)) if (stoixeio < ((*prosorinos)->dedomena)) *prosorinos=*prosorinos)->apaidi; else if (stoixeio > ((*prosorinos)->dedomena)) *prosorinos=(*prosorinos)->dpaidi; else *vrethike = ; Εισαγωγή κόµβου int eisagogi_dentro(typos_deikti *riza, typos_stoixeiou stoixeio) /* Mετά: Aντο stoixeioδεν ανήκει στο A τότε εισάγεται και επιστρέφεται, αλλιώς επιστρέφεται */ Η εισαγωγή γίνεται πάντα ως νέο φύλλο Σε θέση ώστε να διατηρείται η ιδιότητα Α int eisagogi_dentro(typos_deikti *riza, typos_stoixeiou stoixeio){ int eisagogi; if (keno_dentro(*riza)){ *riza = malloc(sizeof(struct typos_komvou)); (*riza)->dedomena = stoixeio; (*riza)->apaidi =(*riza)->dpaidi = NULL; eisagogi = ; else if (stoixeio < (*riza)->dedomena ) /* εισαγωγή στο αριστερό υπόδεντρο */ eisagogi = eisagogi_dentro( &((*riza)->apaidi),stoixeio); else if (stoixeio > (*riza)->dedomena ) /* εισαγωγή στο δεξιό υπόδεντρο */ eisagogi = eisagogi_dentro( &((*riza)->dpaidi),stoixeio); else /* O κόµβος είναι ήδη στο δέντρο */ eisagogi = ; return eisagogi; Μη αναδροµική εισαγωγή Ας υποθέσουµε ότι επιθυµούµε την εισαγωγή του Ν στο ακόλουθο δυαδικό δέντρο αναζήτησης Να βρούµε τον πατέρα (γονέα) riza K pateras prosorinos C G M R P 2

riza K pateras riza K P prosorinos P pateras C G M R C G M R prosorinos riza K K P P C G M R prosorinos pateras C G M R pateras N prosorinos 3

typos_deikti anazitisi_patera(typos_deikti riza, typos_stoixeiou stoixeio, typos_deikti *pateras, int *vrethike){ /* Mετά: Aντο A rizaδεν είναι κενό και το stoixeio δεν ανήκει σε αυτό τοτε το *vrethike είναι και το *pateras είναι η διεύθυνση του κόµβου που θα ήταν πατέρας του stoixeio Aν το riza δεν είναι κενό και το stoixeio ανήκει στο δέντρο και δεν βρίσκεται στη ρίζα του,τότε το *vrethikeείναι και το *paterasείναι η διεύθυνση του κόµβου πατέρα του Aντο stoixeioβρίσκεται στη ρίζα του δέντρου τότε το *vrethike είναι και το *pateras είναι NULL Aντο δέντρο είναι κενό τότε το *vrethike είναι και το *paterasείναι NULL Aντο stoixeioανήκει στο δέντρο τότε η συνάρτηση επιστρέφει τη διεύθυνση του κόµβου που περιέχει το stoixeio, αλλιώς η συνάρτηση επιστρέφει NULL */ typos_deikti anazitisi_patera(typos_deikti riza, typos_stoixeiou stoixeio, typos_deikti *pateras, int *vrethike){ typos_deikti prosorinos; prosorinos = riza; *pateras = NULL; *vrethike = ; while (!(*vrethike) && (prosorinos!=null)){ if (stoixeio < prosorinos->dedomena){ *pateras = prosorinos; prosorinos = prosorinos->apaidi; else if (stoixeio > prosorinos->dedomena){ *pateras = prosorinos; prosorinos = prosorinos->dpaidi; else *vrethike = ; /* ο κόµβος υπάρχει */ return prosorinos; int eisagogi_dentro(typos_deikti *riza, typos_stoixeiou stoixeio) /* Mετά: Aντο stoixeioδεν ανήκει στο A τότε εισάγεται και επιστρέφεται, αλλιώς επιστρέφεται */ int eisagogi_dentro(typos_deikti *riza, typos_stoixeiou stoixeio){ typos_deikti prosorinos, pateras; int vrethike; anazitisi_patera(*riza,stoixeio,&pateras,&vrethike); if (vrethike) return ; else { prosorinos = malloc(sizeof(struct typos_komvou)); prosorinos->dedomena = stoixeio; prosorinos->apaidi = prosorinos->dpaidi = NULL; if ( pateras == NULL ) /* Kενό έντρο */ *riza = prosorinos; else if (stoixeio < pateras->dedomena) pateras->apaidi = prosorinos; else pateras->dpaidi = prosorinos; return ; 4

ιαγραφή κόµβου Για τη διαγραφή ενός κόµβου x από ένα Α διακρίνουµε τρεις περιπτώσεις: Ο κόµβος x είναι φύλλο 2 Ο κόµβος x έχει ένα παιδί 3 Ο κόµβος x έχει δύο παιδιά Ο κόµβος x είναι φύλλο τον διαγράφουµε και τον δείκτη που οδηγεί σε αυτόν NULL B A C G x 2 Ο κόµβος x έχει ένα παιδί B τον παρακάµπτουµε και τον διαγράφουµε x B x B A C G x A G A G 5

ιαγραφή κόµβου µε το πολύ ένα υποδέντρο (ενοποίηση +2) ypodentro = xdpaidi; if (ypodentro == NULL) ypodentro = xapaidi; /* ο δείκτης ypodentro στο παιδί */ x 2 pateras ypodentro if (pateras == NULL)/*διαγράφεται η ρίζα*/ riza = ypodentro; else if (paterasapaidi == x) paterasapaidi = ypodentro; else paterasdpaidi = ypodentro; free(x); 3 Ο κόµβος x έχει δύο παιδιά 3α αντικατάσταση τιµής από την αµέσως επόµενη του και 3β διαγραφή κόµβου προέλευσης τιµής Πού βρίσκεται η αµέσως επόµενη τιµή του; x x Α Α pateras xepomenos G xepomenos G 6

Μη Αναδροµικό Α x xepomenos pateras G void diagrafi_dentrou (typos_deikti *riza, typos_stoixeiou stoixeio) /*Εντοπίζει τον κόµβο µε περιεχόµενο stoixeio και τον διαγράφει από το Α*/ typos_deikti x; //δείχνει τον κόµβο που αναζητούµε typos_deikti pateras; // ο πατέρας του x typos_deikti xepomenos; /*ο επόµενος του x*/ typos_deikti ypodentro; /* το υποδέντρο του x*/ int vrethike; /*true stoixeio βρίσκεται στο Α*/ συνέχεια { anazitisi_patera(*riza,stoixeio,x,&pateras,&vrethike); if (!vrethike) printf ( Ο κόµβος δεν υπάρχει στο Α ); else { if ((x->apaidi!= NULL) && (x->dpaidi!= NULL)){ /*ο κόµβος έχει δύο παιδιά, εντοπισµός του επόµενου κόµβου και του πατέρα του*/ xepomenos = x->dpaidi; pateras = x; while (xepomenos->apaidi!= NULL){ /*µονοπάτι αριστερών υποδέντρων*/ pateras = xepomenos; xepomenos = xepomenos->apaidi; // έχει βρεθεί ο επόµενος συνέχεια /*ανταλλαγή των περιεχοµένων των xepomenos και και αλλαγή της τιµής του x ώστε να δείχνει τον xepomenos που πρόκειται να διαγραφτεί*/ x->dedomena = xepomenos->dedomena; x = xepomenos; //θα διαγραφεί στην συνέχεια /* περιπτώσεις όπου ο κόµβος έχει ή παιδί*/ ypodentro = x ->dpaidi; if (ypodentro == NULL) ypodentro = x ->apaidi; if (pateras == NULL) /*διαγράφεται η ρίζα*/ riza = ypodentro; else if (pateras->apaidi == x) /*αριστερό παιδί του πατέρα*/ pateras->apaidi = ypodentro; else pateras->dpaidi = ypodentro; free(x); 7

void diagrafi_komvou(typos_deikti *riza, typos_stoixeiou stoixeio){ /* Προ:Υπάρχει ο κόµβος µε περιεχόµενο stoixeio στο Α Μετά: ιαγράφτηκε ο κόµβος µε περιεχόµενο stoixeio */ typos_deikti prosorinos, xepomenos; if (!keno_dentro (*riza)) if (stoixeio == (*riza)->dedomena){ if (keno_dentro((*riza)->apaidi))){ /* Η riza δεν έχει αριστερό παιδί */ prosorinos = *riza; *riza = (*riza) -> dpaidi; free (prosorinos); else if (keno_dentro((*riza)->dpaidi))) /* Η riza δεν έχει δεξί παιδί */{ prosorinos = *riza; *riza = (*riza)->apaidi; free (prosorinos); else /* Η riza έχει δύο παιδιά */ { /* Εύρεση του ενδοδιατεταγµένου επόµενου */ xepomenos = (*riza) -> dpaidi; while (xepomenos -> apaidi! = NULL) xepomenos = xepomenos->apaidi; /* Ανταλλαγή των περιεχόµενων*/ (*riza)->dedomena = xepomenos->dedomena; /* διαγραφή του ενδοδιατεταγµένου επόµενου */ diagrafi_komvou(&((*riza)->dpaidi), (*riza)-> dedomena); else /* stoixeio!= (*riza) -> dedomena */ if (stoixeio < (*riza)->dedomena) diagrafi_komvou(&((*riza)->apaidi),stoixeio); else diagrafi_komvou (&((*riza)->dpaidi),stoixeio); Εφαρµογές δυαδικών δέντρων : Κώδικες Huffman Επεκταµένο υαδικό έντρο A B C l G = + + + = 4 (για κάθε κόµβο µήκος µονοπατιού) = 3 + 3 + 5 + 5 + 4 + 3 + 2 + 2 = 27 (εξωτερ µονοπάτι δένδρου) I = + + + 2 + 2 + 3 + 4 = 3 (εσωτερικό µονοπάτι δένδρου) Πρόταση : Αν s i είναι το πλήθος των εξωτερικών κόµβων στο επίπεδο i, τότε : G Προσθέτουµε n+ εξωτερικούς Κόµβους (ορθογώνιους) Πρόταση : Αν n i είναι το πλήθος των εσωτερικών κόµβων στο επίπεδο i, τότε : 8

(, L) = L (T =,L)= (T α,l+) + (T δ,l+) Αναδροµικός Υπολογισµός του Ι µε συνάρτηση I(T, L=) I(, L) = I(T = T α T δ,l)= I(T α,l+) + I(T δ,l+) + L T α T δ Πρόταση : Για ένα δυαδικό δέντρο Τ µε n εσωτερικούς κόµβους ισχύει : (T) = (T) - I(T) = 2n Απόδειξη µε επαγωγή Ισχύει για n=, I(T )=, (T )=2, (T )-I(T )=2 Έστω ότι ισχύει για n=k, δηλαδή Ε(Τ k )-Ι(Τ k ) = 2k Προσθέτουµε έναν εσωτερικό κόµβο ακόµα (k+ εσωτερικοί) σε επίπεδο L+ I(T k+ )=I(T k )+L; (T k+ )=(T k )-L+2(L+)=(T k )+L+2 (T k+ )-I(T k+ )= ((T k )+L+2 )- ( I(T k )+L) = (T k )-I(T k )+2 = 2k+2= 2(k+) Εφόσον (T) = I(T) + 2n αρκεί να µελετηθούν οι ιδιότητες µόνο του Ε(Τ) ή τουι(τ) Ο µέσος αριθµός συγκρίσεων S(n) σε µια επιτυχηµένη αναζήτηση είναι : όπου υποτίθεται ότι όλοι οι κόµβοι έχουν την ίδια πιθανότητα εµφάνισης Ο µέσοςαριθµόςσυγκρίσεων U(n)σε µια αποτυχηµένη αναζήτηση είναι : Συνδιάζοντας τις ανωτέρω σχέσεις προκύπτει : Συνεπώς ο µέσος αριθµός συγκρίσεων για µια επιτυχηµένη αναζήτηση είναι περίπου ο ίδιος µε εκείνον για µια αποτυχηµένη αναζήτηση Γνωρίζοντας δηλαδή ότι ένα στοιχείο βρίσκεται στo δένδρο, η αναζήτησή του µε τη µέθοδο των συγκρίσεων των κλειδιών του δεν προσφέρει µεγάλη βοήθεια 9

Ποιάείναιόµωςη ελάχιστηκαιµέγιστηδυνατήτιµήτουι από όλα τα δυαδικά δέντρα µε n εσωτερικούς κόµβους ; Μέγιστη (όταν στοιχείο ανά επίπεδο) Ι = + + + (n-2) + (n-) = n(n-)/2 Ο(n 2 ) Η ελάχιστη τιµή του Ι επιτυγχάνεται για ένα πλήρες δυαδικό δέντρο µε h επίπεδα: (στο iεπίπεδο 2 i- κόµβους) + ( + ) + (2 + 2 + 2 + 2) + + (i-)*2 i- + + (h-)* 2 h- Όπου <= i <= h, το επίπεδο του δένδρου Αν ένας κόµβος βρίσκεται στο iεπίπεδο, χρειαζόµαστε iβήµατα και στην χειρότερη περίπτωση h βήµατα, δηλαδή log 2 (n+),εφόσον n = 2 h - Εποµένως το Ι min = O(nlog 2 n), εφόσον έχουµε n κόµβους Γενίκευση: Εξωτερικό Μονοπάτι Βάρους Έστω δένδρο µε n εξωτερικούς κόµβους (n-εσωτερικούς) Θετικοί αριθµοί (βάρη) w w n αντιστοιχούνται στους εξωτερικούς κόµβους (συχνότητα πρόσβασης) Εξωτερικό Μονοπάτι Βάρους: Ποιο δένδρο µε n εξωτερικούς θα µας δώσει το ελάχιστο Εξωτερικό Μονοπάτι βάρους; Ποιός είναι ο καλύτερος κώδικας για το σύνολο των χαρακτήρων {C, C 2,, C n µε βάρη w, w 2,, w n Αλγόριθµος Huffman 2 5 7 = 3*2+3*5+2*7+*= 6+5+4+ = 45 = 63 7 5 2 2 5 7 = 48 ηµιουργία µιας λίστας από δυαδικά δέντρα µε ένα κόµβο που περιέχουνταβάρη w, w 2,, w n ταξινοµηµένα (πχ σεαύξουσα σειρά), έναγιακάθεχαρακτήρα C, C 2,, C n 2 Τα παρακάτω βήµατα εκτελούνται n- φορές: a) ΕύρεσηδύοδέντρωνΤ καιτ τηςλίσταςµερίζεςτα µικρότερα βάρη w και w b) Αντικατάσταση των δέντρων αυτών µε ένα δυαδικό δέντρο τουοποίουη ρίζαείναι w + w και υποδέντρατουτατ καιτ δίνονταςτιςτιµές και γιατουςδείκτεςτου αριστερού και δεξιού υποδέντρου του, αντίστοιχα 3 Ο κώδικαςγιατονχαρακτήρα C i είναιεκείνηη διψήφιασειρά χαρακτήρων που ξεκινά από τη ρίζα του τελικού δυαδικού δέντρουκαικαταλήγειστοφύλλο C i

w +w ) 5 2 25 3 B A C Τ Τ Στη συνέχεια ας υποθέσουµε ότι έχουµε τον παρακάτω πίνακα: Χαρακτήρας βάρος Α B C 2 3 25 5 Η εφαρµογή του αλγορίθµου του Huffman παράγει τις παρακάτω διαδοχικές φάσεις δηµιουργίας του δυαδικού δέντρου αποκωδικοποίησης: 2) 25 5 2 25 3 B A C 45 45 25 25 55 3) 5 2 25 3 3) 5 2 25 3 B A C B A C

5) 25 45 5 2 25 3 B A C 55 Οι κώδικες Huffman που λαµβάνονται από το παραπάνω δέντρο είναι: Χαρακτήρας A B C Κώδικας Huffmann Επίσης η ποσότητα είναι ίση µε : Ε = *3+5*3+2*2+25*2+3*2 = 225 Ας σηµειωθεί ότι είναι δυνατή µια διαφορετική αντιστοιχία κωδικών στους χαρακτήρες του παραδείγµατος µε την ίδια τιµή για την Ε Πράγµατι, στη δεύτερη φάση δηµιουργίας του δυαδικού δέντρου θα µπορούσαµε να προχωρήσουµε όπως φαίνεται παρακάτω: 55 25 45 5 2 25 3 B A C 25 45 5 3 2 25 B C A 2

55 25 45 5 3 2 25 B C A Στην περίπτωση αυτή οι κώδικες που αντιστοιχούν στους χαρακτήρες δίνονται από τον παρακάτω πίνακα : Χαρακτήρας A B C Κώδικας Huffmann Αλγόριθµος αποκωδικοποίησης Huffman Αρχικά ένας δείκτης p τοποθετείται στη ρίζα του δέντρου Huffman 2 Οσο δεν έχει βρεθεί το τέλος του µηνύµατος να εκτελούνται τα παρακάτω: α Έστω x είναι το επόµενο bit στη σειρά χαρακτήρων βαν x == τότε p = p apaidi διαφορετικά p = p dpaidi γανο p δείχνεισ' έναφύλλοτότε: i Να εκτυπωθεί ο χαρακτήρας αυτού του φύλλου ii p = riza Γιαπαράδειγµα, αςυποτεθείότιτοµήνυµα έχει ληφθεί και κωδικοποιήθηκε µε τη δηµιουργία του δεύτερου δέντρου Huffman Τότε η αποκωδικοποίηση είναι: C C C A A 55 25 45 5 3 2 25 B C A Ενώ µε το πρώτο δένδρο θα ήταν: A A A 3

2 h = 7 3 Χρονική Πολυπλοκότητα Αλγορίθµων για Α 4 5 6 h = 3 2 4 6 3 5 7 Τέλεια ισοζυγισµένο δένδρο αν για κάθε κόµβο του, ο αριθµός των κόµβων αριστερού και δεξιού υποδένδρου διαφέρει το πολύ κατά ένα 7 Το ύψος hενός Α εξαρτάται από το σχήµα του Ας υποθέσουµε ότι οι κόµβοι έχουν φθάσει µε µια τυχαία σειρά, τότε πόσες περισσότερες συγκρίσεις, κατά µέσο όρο, απαιτούνται σε µια αναζήτηση του προκυπτόµενου τυχαίου Α από εκείνες που απαιτεί ένα τέλεια ισοζυγισµένο Α; n στοιχεία έχουν n! διατάξεις µε ίση πιθανότητα εµφάνισης S συγκρίσεις για επιτυχηµένη αναζήτηση, U για αποτυχηµένη () (2) (),(2) (3) n=, n = n+ (4) (3) - (4) (5) n=2, ή (6) 4

όπου αρµονικός αριθµός (7) Τοµέσοκόστοςγιατη (τυχαία) µηισοζύγισηενός Α είναι περίπου 39% περισσότερες συγκρίσεις (6) (7), σταθερά του uler ή 5