ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 2010 2011, Χειµερινό εξάµηνο Όλες οι ασκήσεις να δακτυλογραφηθούν στον υπολογιστή και να παραδοθούν σε έντυπη µορφή. ΕΡΓΑΣΙΑ 3 18/11/2010 Ηµεροµηνία Παράδοσης: ευτέρα 29/11/2010 ΘΕΜΑΤΙΚΕΣ ΕΝΟΤΗΤΕΣ: ΑΛΓΟΡΙΘΜΟΙ ΤΑΞΙΝΟΜΗΣΗΣ, ΕΝ ΡΑ Άσκηση 1 (30 µονάδες) Δίδεται ο ακόλουθος πίνακας ακέραιων αριθμών: 10 11 72 12 1 34 3 50 28 6 5 22 91 73 Δείξτε σχηματικά (δείτε διαφάνεια 9 Διάλεξη 15) τα βήματα της διαδικασίας patition που ακολουθείται για την ταξινόμηση του πιο πάνω πίνακα με τη μέθοδο Ταξινόμησης QuickSot - (εξηγώντας σε συντομία το κάθε βήμα). Να γίνει η υπόθεση ότι επιλέγεται το 28 ως το pivot και να ακολουθηθεί η διαδικασία μέχρι να διασταυρωθούν για πρώτη φορά τα και και να επιστέψει το pivot (28) στη σωστή θέση. εδοµένο εισόδου: 10 11 72 12 1 34 3 50 28 6 5 22 91 73 Επιλέγουµε ως pivot το 28 και κάνουµε swap τον pivot µε το τελευταίο. 10 11 72 12 1 34 3 50 73 6 5 22 91 28
Swap 72 22 Swap 34 5 Swap 50 6 1. Επαναλαµβάνουµε τα εξής µέχρις ότου τα και να διασταυρωθούν. 2. Προχώρα το προς τα δεξιά όσο τα στοιχεία που βρίσκεις είναι µικρότερα του p, 3. Προχώρα το προς τα αριστερά όσο τα στοιχεία που βρίσκεις είναι µεγαλύτερα (ή ίσα) του p, 4. Αντάλλαξε τα στοιχεία που δείχνονται από τα και. 10 11 72 12 1 34 3 50 73 6 5 22 91 28 10 11 72 12 1 34 3 50 73 6 5 22 91 28 10 11 22 12 1 34 3 50 73 6 5 72 91 28 10 11 22 12 1 5 3 50 73 6 34 72 91 28 10 11 22 12 1 5 3 50 73 6 34 72 91 28 10 11 22 12 1 5 3 50 73 6 34 72 91 28 10 11 22 12 1 5 3 6 73 50 34 72 91 28 Retun pivot to index position 73 28. Fom now on the pivot (28) is aways ocated at a soted/coect position. 10 11 22 12 1 5 3 6 28 50 34 72 91 73
Άσκηση 2 (30 µονάδες) ώστε την Μεταθεµατική ιάσχιση (Postode) και την Προθεµατική ιάσχιση (Peode) για τα πιο κάτω δένδρα (δείτε διαφάνεια 19 ιάλεξη 16). (α) + (β) + * 3 * 3 / 5 8 + 7 3 7 3 (γ) * + - 4-2 5 7 3 (α) Προθεµατική ιάσχιση (Peode) : + * / 7 3 5 3 Μεταθεµατική ιάσχιση (Postode): 7 3 / 5 * 3 + (β) Προθεµατική ιάσχιση (Peode) : + * 8 + 7 3 3 Μεταθεµατική ιάσχιση (Postode): 8 7 3 + * 3 + (γ) Προθεµατική ιάσχιση (Peode) : * + 4 7 3 2 5 Μεταθεµατική ιάσχιση (Postode): 473 - + 25 - *
Άσκηση 3 (40 µονάδες) Quiz - Εργαστήριο Bonus - Άσκηση 1 (35 µονάδες) Δίδεται ο ακόλουθος πίνακας ακέραιων αριθμών: 3 9 5 87 34 56 12 6 Δείξτε σχηματικά (δείτε διαφάνεια 6 Διάλεξη 13) τα βήματα της διαδικασίας ταξινόμησης του πιο πάνω πίνακα με τη μέθοδο Ταξινόμησης με Επιλογή (Seection Sot) - (εξηγώντας σε συντομία το κάθε βήμα). Ποιος είναι ο χρόνος εκτέλεσης της Ταξινόμησης με Επιλογή (Seection sot); (α) Βήματα Εκτέλεσης: Αρχικός πίνακας 3 9 5 87 34 56 12 6 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=0 3 9 5 87 34 56 12 6 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=1 3 5 9 87 34 56 12 6 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=2 3 5 6 87 34 56 12 9 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=3 3 5 6 9 34 56 12 87 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=4 3 5 6 9 12 56 34 87
Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=5 3 5 6 9 12 34 56 87 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=6 3 5 6 9 12 34 56 87 Διαλέγουμε το μικρότερο και κάνουμε swap με τη θέση i=7 3 5 6 9 12 34 56 87 Χρόνος εκτέλεσης αλγορίθμου Seection Sot: Ο(n^2) Bonus - Άσκηση 2 (30 µονάδες) Δίδεται ο ακόλουθος πίνακας ακέραιων αριθμών: 9 2 8 3 6 1 1 6 6 2 Δείξτε σχηματικά (δείτε διαφάνεια 15 Διάλεξη 14) τα βήματα της διαδικασία ταξινόμησης του πιο πάνω πίνακα με τη μέθοδο Ταξινόμησης με Κάδους (BucketSot). Βήματα Εκτέλεσης: εδοµένο Εισόδου: Τα στοιχεία είναι στο εύρος m=[0,9] 9 2 8 3 6 1 1 6 6 2 Μετά την 1η εκτέλεση του Bucketsot (Εισαγωγή του 9) 0 0 0 0 0 0 0 0 0 1 Μετά την 2η εκτέλεση του Bucketsot (Εισαγωγή του 2) 0 0 1 0 0 0 0 0 0 1
Μετά την 3η εκτέλεση του Bucketsot (Εισαγωγή του 8) 0 0 1 0 0 0 0 0 1 1 Μετά την 4η εκτέλεση του Bucketsot (Εισαγωγή του 3) 0 0 1 1 0 0 0 0 1 1 Μετά την 5η εκτέλεση του Bucketsot (Εισαγωγή του 6) 0 0 1 1 0 0 1 0 1 1 Μετά την 6η εκτέλεση του Bucketsot (Εισαγωγή του 1) 0 1 1 1 0 0 1 0 1 1 Μετά την 7η εκτέλεση του Bucketsot (Εισαγωγή του 1) 0 2 1 1 0 0 1 0 1 1 Μετά την 8η εκτέλεση του Bucketsot (Εισαγωγή του 6) 0 2 1 1 0 0 2 0 1 1 Μετά την 9η εκτέλεση του Bucketsot (Εισαγωγή του 6) 0 2 1 1 0 0 3 0 1 1 Μετά την 10η εκτέλεση του Bucketsot (Εισαγωγή του 2) Ταξινομημένος Πίνακας: 0 2 2 1 0 0 3 0 1 1 1 1 2 2 3 6 6 6 8 9
Bonus - Άσκηση 3 (35 µονάδες) Να γράψετε µια αναδροµική συνάρτηση η οποία να τυπώνει τα στοιχεία ενός δυαδικού δένδρου τα οποία είναι µικρότερα από την τιµή (key) που δίνεται ως παράµετρος της συνάρτησης. Πρότυπο συνάρτησης: void pintlessthankey(node *oot, int key) ίνεται κώδικας της υλοποίησης δυαδικού δένδρου που πρέπει να ακολουθηθεί για να υλοποιήσετε την πιο πάνω συνάρτηση. Η απάντηση σας να δοθεί στο κενό της συνάρτησης pintlessthankey. Αποτέλεσµα εκτέλεσης: #incude <stdio.h> typedef stuct node { int va; stuct node *eft; stuct node *ight; NODE; typedef stuct tee { NODE *oot; TREE; void MakeEmptyTee(TREE *T){ T->oot = NULL; NODE *FindNode(NODE *oot, int va) { if (oot == NULL) etun NULL; ese if (oot->va == va) etun oot; ese { if (va < oot->va) etun FindNode(oot->eft, va);
ese etun FindNode(oot->ight, va); NODE *InsetNode(NODE *oot, int va){ if (oot == NULL) { // åéóáãùãþ êüìâïõ oot = (NODE *) maoc(sizeof(node)); if (oot==null) { pintf("out of Memoy!"); exit(1); oot->va = va; oot->eft = NULL; oot->ight = NULL; ese { if (va < oot->va) // åéóáãùãþ áñéóôåñü oot->eft = InsetNode(oot->eft, va); ese // åéóáãùãþ äåîéü oot->ight = InsetNode(oot->ight, va); etun oot; /** This is not a geneic function. It is ony impemented to pint the specific pefect tee ceated in the main of this pogam. Thus, it can ONLY be used by this pogam to pint gaphicay the tee fo demonstation puposes.**/ void pinttee(node *oot){ pintf("---------------%d----------------\n", oot->va); pintf("------%d-----------------%d------\n", (oot->eft)->va, (oot->ight)->va); pintf("-%d---------%d-------%d---------%d-\n", ((oot->eft)->eft)->va, ((oot->eft)->ight)->va, ((oot->ight)->eft)->va, ((oot->ight)->ight)->va); void pintlessthankey(node *oot, int key){ if (oot == NULL) etun; if (oot->va < key) pintf("%d,", oot->va); pintlessthankey(oot->eft, key); pintlessthankey(oot->ight, key);
int main(){ int i; TREE *tee; MakeEmptyTee(tee); tee->oot = InsetNode(tee->oot, 5); pintf("node %d: %d\n", 1, (tee->oot)->va); InsetNode(tee->oot, 3); pintf("node %d: %d\n", 2, (FindNode(tee->oot, 3))->va); InsetNode(tee->oot, 11); pintf("node %d: %d\n", 3, (FindNode(tee->oot, 11))->va); InsetNode(tee->oot, 2); pintf("node %d: %d\n", 4, (FindNode(tee->oot, 2))->va); InsetNode(tee->oot, 4); pintf("node %d: %d\n", 5, (FindNode(tee->oot, 4))->va); InsetNode(tee->oot, 8); pintf("node %d: %d\n", 6, (FindNode(tee->oot, 8))->va); InsetNode(tee->oot, 13); pintf("node %d: %d\n", 7, (FindNode(tee->oot, 13))->va); pinttee(tee->oot); pintlessthankey(tee->oot, 8);