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

Σχετικά έγγραφα
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΠΛ 232: Αλγόριθµοι και Πολυπλοκότητα. Κατ οίκον Εργασία 2A Σκελετοί Λύσεων

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

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

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

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

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

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

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

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

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

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

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

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

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

Γέφυρες σε Δίκτυα. Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος. Γέφυρα του (με αφετηρία τον ) :

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

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

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

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

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

Φροντιστήριο 4 Σκελετοί Λύσεων

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

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

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

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

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

3 Αναδροµή και Επαγωγή

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

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

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

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

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

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

ΕΠΛ 232: Αλγόριθµοι και Πολυπλοκότητα. Κατ οίκον Εργασία 1 Σκελετοί Λύσεων

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

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

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

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

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

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

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

ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ. ΗΥ240 - Παναγιώτα Φατούρου 1

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

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

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

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

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

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

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

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

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

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

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

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

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

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

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

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

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

Στοίβες Ουρές - Λίστες

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

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

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

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

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

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

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

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

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

Transcript:

Άσκηση 1 Χρησιµοποιούµε τη δοµή Κατ οίκον Εργασία 3 Σκελετοί Λύσεων typedef struct Node int data; struct node *lchild; struct node *rbro; node; και υποθέτουµε πως ένα τυχαίο δένδρο είναι υλοποιηµένο ως δείκτης στη ρίζα του δένδρου, δηλαδή, έχει τύπο *node. (i) Το ύψος ενός δένδρου ισούται µε το µέγιστο ύψος των παιδιών του +1. Αναδροµικά έχουµε την πιο κάτω διαδικασία: int Height(node *p) h = -1; if (p == NULL) return h; p = p->lchild; while (p!= NULL) h = max(h, Height(p)); p = p -> rbro; return h+1; Xρόνος εκτέλεσης: Θ(n) όπου n είναι ο αριθµός κόµβων του δένδρου. (ii) Το επίπεδο ενός κόµβου ισούται µε τον αριθµό των προγόνων του +1. Για την υλοποίηση της διαδικασίας θα χρειαστούµε τη βοηθητική δοµή ουρά, όπου θα φυλάγονται οι κόµβοι για να τύχουν επεξεργασίας αργότερα. Σε κάθε κόµβο της ουράς φυλάγεται µια δυάδα, ο κόµβος του δένδρου και το επίπεδο στο οποίο βρίσκεται, έτσι ώστε όταν αφαιρέσουµε τον κόµβο από την ουρά να ξέρουµε το επίπεδό του. void elements(node *t, int level) int clevel = 1; node *q,*p = t; Queue Q; MakeEmptyQueue(Q); if (t==null) exit(0) while (p!= null) // Αν είµαστε στο σωστό επίπεδο τυπώνουµε τον κόµβο 1

// και τα αδέλφια του. if(clevel == level) print (p->data); q = p->rbro; while (q!= null) print (q->data); q = q->rbro; // εν υπάρχει λόγος επεξεργασίας των παιδιών του // κόµβου, αφού θα έχουν µεγαλύτερο επίπεδο. Γι αυτό // αφαιρούµε ένα κόµβο από την ουρά και τον // επεξεργαζόµαστε if (!IsEmptyQueue(Q) (p,clevel) = DeQueue(Q); // Αν δεν είµαστε στο σωστό επίπεδο και ο κόµβος δεν // έχει παιδιά επεξεργαζόµαστε ένα κόµβο από την ουρά. // Αν δεν υπάρχει κόµβος στην ουρά τερµατίζουµε if (p->lchild == null) if (!IsEmptyQueue(Q) (p,clevel) = DeQueue(Q); exit(0); // Αν δεν είµαστε στο σωστό επίπεδο και ο κόµβος έχει // παιδιά φυλάγουµε τα αδέλφια του στην ουρά και // επεξεργαζόµαστε το αριστερό του παιδί, αυξάνοντας το // επίπεδο κατά 1 q = p->rbro; while (q!= null) EnQueue((q->rbro, clevel), Q); p = p->lchild; clevel += 1; Χρόνος εκτέλεσης: Θ(n) όπου n είναι ο αριθµός κόµβων του δένδρου. Άσκηση 2 Εισαγωγή των χαρακτήρων µε αλφαβητική σειρά έχει ως αποτέλεσµα τη δηµιουργία του δένδρου µε τον µεγαλύτερο αριθµό κόµβων: 15 κόµβοι, δηλαδή κάθε κόµβος έχει ένα κλειδί. Μια άλλη σειρά που παράγει το ίδιο δένδρο είναι η Π, Υ, Ε, Β, Ν, Σ, Χ, Α,, Μ, Ο, Ρ, Τ, Φ και Ω. Μια σειρά που παράγει µε τον µικρότερο αριθµό κόµβων είναι η Π, Α, Ω, Ο, Ρ,, Φ, Ν, Τ, Υ, Β, Ε, Μ, Σ και Υ. Η σειρά αυτή παράγει δένδρο µε 9 κόµβους. 2

Άσκηση 3 Χρησιµοποιούµε τη δοµή typedef struct AVLNode int data; int height struct AVLNode *left; struct AVLNode *right; int greater; avlnode; και υποθέτουµε πως ένα AVL δένδρο είναι υλοποιηµένο ως δείκτης στη ρίζα του δένδρου, δηλαδή, έχει τύπο *avlnode. Στο πεδίο greater είναι αποθηκευµένος ο αριθµός των κόµβων του αριστερού υποδένδρου του κόµβου. (i) Η κύρια ιδέα είναι η εξής: αν ο κόµβος x είναι µεγαλύτερος από i-1 στοιχεία τότε είναι το i-οστό στοιχείο του δένδρου, άρα επιστρέφουµε το στοιχείο x.data. ιαφορετικά, (1) αν είναι µεγαλύτερος ή ίσος από λιγότερα των i στοιχείων, έστω j στοιχεία, τότε πρέπει να βρούµε το (i-(j+1))-οστό µεγαλύτερο στοιχείο του δεξιού υποδένδρου του κόµβου x, και, τέλος, (2) αν είναι µεγαλύτερος ή ίσος από περισσότερα από i-1 (έστω j), τότε πρέπει να βρούµε το i-οστό στοιχείο του αριστερού υποδένδρου. int Find(avlnode *t, int i) avlnode *q = t; (ii) while (i!= q->greater+1 && q!= null) if (q->greater < i) i = i - q->greater+1; q = q->right; if (q->greater > i) q = q->left if (q==null) return error return q->data; int Size(avlnode *t) avlnode *q = t; int size = 0; while (q!= null) size = q->greater + 1 + size; q = q->right; return size; 3

Άσκηση 4 Παρατηρούµε ότι δοθέντος ενός radix-δένδρου που περιέχει τα στοιχεία µας µπορούµε να επιστρέψουµε τη λίστα των στοιχείων ταξινοµηµένη εφαρµόζοντας µια προθεµατική διερεύνηση στο δένδρο. Μια τέτοια διερεύνηση παίρνει χρόνο Θ(n), όπου n είναι ο αριθµός των κόµβων του δένδρου, ενώ επίσης παρατηρούµε (και µπορούµε εύκολα να αποδείξουµε) ότι ο αριθµός κόµβων του δένδρου είναι του αθροίσµατος των ψηφίων που αποθηκεύει. ηλαδή, το βήµα της προθεµατικής διερεύνησης του δένδρου είναι της τάξης Ο(n) όπου n είναι το άθροισµα των ψηφίων που αποθηκεύει. Παραµένει να µελετήσουµε πως µπορούµε να κτίσουµε το radix-δένδρο που αντιστοιχεί σε ένα σύνολο δυαδικών αριθµών. Χρησιµοποιούµε τη γνωστή υλοποίηση δυαδικών δένδρων, δηλαδή, υποθέτουµε ότι οι κόµβοι του δένδρου είναι υλοποιηµένοι ως εγγραφές µε τρία πεδία, και ένα δένδρο ως δείκτης στη ρίζα του: struct Node string word; Node *left; Node *right; struct radix Node *start Οι διαδικασίες MakeEmpty(t) και Ιnsert(t, A, n) (η οποία εισαγάγει στο δένδρο t την συµβολοσειρά A, η οποία περιέχει n ψηφία) έχουν ως εξής: MakeEmpty(struct radix t) t->start = null Insert(radix t, string A, int n) if (t->start == NULL) s = malloc(sizeof(struct Node)); s->word = s->left = s->right = NULL; t->start = s; i=1; s = t->start; while (i n) if (A[i]==0) if (s->left == null) p = malloc(sizeof(struct Node)); p->word = p->left = p->right = NULL; s->left = p; s = p->left; if (s->right == null) p = malloc(sizeof(struct Node)); p->word = p->left = p->right = NULL; s->right = p; 4

s = p->right; i++ s->word = A; H διαδικασία Insert ξεκινώντας από τη ρίζα του δένδρου προχωρά µέσα στο δένδρο δεξιά ή αριστερά ανάλογα µε τον αριθµό που θέλει να προσθέσει, δηµιουργώντας καινούριους κόµβους κατάλληλα. Σε ενδιάµεσους νέους κόµβους αποθηκεύει δείκτες NULL που δηλώνουν ότι οι κόµβοι είναι άδειοι, ενώ όταν φτάσει στον κατάλληλο κόµβο εισάγει την συµβολοσειρά, Α. Παρατηρούµε ότι ο χρόνος εκτέλεσης της Ιnsert(t, A, n) είναι της τάξης Θ(n) όπου n είναι ο αριθµός των ψηφίων της συµβολοσειράς που εισάγεται. Συνεπώς ο αλγόριθµος ταξινόµησης αποτελείται από τα εξής βήµατα: (α) δηµιούργησε ένα άδειο radix-δένδρο, (β) εισήγαγε σε αυτό όλες τις συµβολοσειρές του S και (γ) εκτέλεσε προθεµατική διερεύνηση στο δένδρο (τυπώνοντας όλα τις συµβολοσειρές του δένδρου). Αφού το βήµα (α) είναι τάξης Ο(1), το βήµα (β) τάξης Θ(n) και το βήµα (γ) τάξης Ο(n), συνολικά ο προτεινόµενος αλγόριθµός έχει χρόνο εκτέλεσης Θ(n) όπως χρειάζεται. 5