Κ08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού Διδάσκων: Μανόλης Κουμπαράκης Εαρινό Εξάμηνο 2017-2018. Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα). 15% του συνολικού βαθμού στο μάθημα. 1. Σχεδιάστε το Β-δένδρο που προκύπτει αν εισάγουμε τα κλειδιά 88, 2, 86, 6, 4, 82, 70, 20, 66, 30, 90, 59, 25, 72, 64, 77, 39, 12 με αυτή τη σειρά σε ένα αρχικά κενό Β-δένδρο τάξεως 7. Μετά σχεδιάστε το Β-δένδρο που θα προκύψει αν διαγράψουμε όλα τα στοιχεία της ρίζας από το μικρότερο προς το μεγαλύτερο. (10+5=15 μονάδες) 2. Θεωρήστε τον κώδικα της Ενότητας 13 που υλοποιεί την δομή του B-δένδρου. Να υλοποιήσετε τη συνάρτηση Successor της διαφάνειας 80. Μετά να προσθέσετε στον κώδικα μια συνάρτηση η οποία παίρνει σαν όρισμα ένα δείκτη στη ρίζα ενός Β-δένδρου και ένα φυσικό αριθμό k 0 και διαγράφει το k-οστό μικρότερο στοιχείο του Β-δένδρου (έχουμε δώσει μια παρόμοια συνάρτηση select στον κώδικα της Ενότητας 9 για δένδρα δυαδικής αναζήτησης). Να προσθέσετε κατάλληλο κώδικα στη main που θα ελέγχει την συμπεριφορά των συναρτήσεων που αναπτύξατε. (20+50=70 μονάδες) 3. Θεωρήστε ένα μη κατευθυνόμενο γράφο G = V, E με σύνολο κορυφών V = 1, 2,,7 και σύνολο ακμών Ε = 1,2, 1,6, 6,5, 2,7, 2,3, 7,5, 7,4, 5,4, 3,4. Να σχεδιάσετε τον παραπάνω γράφο. Να δώσετε την ακολουθία κορυφών που προκύπτει αν διασχίσουμε το γράφο χρησιμοποιώντας τους αλγόριθμους DFS (με αναδρομική κλήση) και BFS από τις διαφάνειες της Ενότητας 15. Να υποθέσετε ότι ο αλγόριθμος ξεκινάει από τον κόμβο 1 και η σειρά των ακμών στις λίστες γειτνίασης είναι αριθμητική. (5+5+5=15 μονάδες)
4. Θεωρήστε τον κατευθυνόμενο γράφο G = V, E με σύνολο κορυφών V = 0, 1, 2,,9 και σύνολο ακμών Ε = { 1,2, 1,4, 2,3, 4,3, 4,6, 6,5, 5,7, 6,8, 5,8, 8,7, 9,8, 0,5 }. Να σχεδιάσετε τον δοσμένο γράφο και να δώσετε μια τοπολογική ταξινόμηση του (topological sort). 5. Να υλοποιήσετε ένα αλγόριθμο που αποφασίζει αν ένας δοσμένος γράφος είναι κυκλικός ή όχι χρησιμοποιώντας των αλγόριθμο τοπολογικής ταξινόμησης που δώσαμε στις διαφάνειες της Ενότητας 15 (Graphs). (30 μονάδες) 6. Θεωρήστε τον κατευθυνόμενο γράφο G = V, E με σύνολο κορυφών V = 1, 2,,12 και σύνολο ακμών Ε = { 1,2, 2,3, 2,4, 4,5, 2,5, 5,2, 3,6, 6,3, 5,6, 6,8, 5,7, 7,8, 8,7, 9,7, 7,10, 10,9, 10,11, 11,12, 12,10 } Να σχεδιάσετε τον δοσμένο γράφο και να δώσετε τις ισχυρά συνεκτικές συνιστώσες του (strongly connected components). 7. Θεωρήστε τον κατευθυνόμενο γράφο με βάρη στις ακμές G = V, E με σύνολο κορυφών V = a, b, c, d, e, f, g, h και σύνολο ακμών Ε = { a, b, 1, a, e, 10, b, e, 8, e, d, 15, e, f, 5, e, c, 2, c, f, 2, e, g, 3, g, f, 4, f, h, 5 }. Στο σύνολο ακμών συμβολίζουμε μια ακμή από την κορυφή x στην κορυφή y με βάρος w με την τριάδα x, y, w. Να σχεδιάσετε τον δοσμένο γράφο. Μετά να εκτελέσετε τον αλγόριθμο του Dijkstra στον γράφο αυτό για να λύσετε το πρόβλημα του συντομότερου μονοπατιού κοινής αφετηρίας ξεκινώντας από την κορυφή a. 8. Να υλοποιήσετε ένα αλγόριθμο επίλυσης του προβλήματος συντομότερου μονοπατιού κοινής αφετηρίας (single-source shortest paths problem) για ένα δοσμένο κατευθυνόμενο ακυκλικό γράφο (directed acyclic graph) χρησιμοποιώντας τον αλγόριθμο τοπολογικής ταξινόμησης που δώσαμε στις διαφάνειες της Ενότητας 15 (Graphs).
(30 μονάδες) 9. Να υλοποιήσετε τον αλγόριθμο του Κruskal για τον υπολογισμό του ελάχιστου δέντρου επικάλυψης ενός δοσμένου μη-κατευθυνόμενου γράφου. (50 μονάδες) 10. Να υπολογίσετε την υπολογιστική πολυπλοκότητα χειρίστης περίπτωσης του αλγόριθμου σας για το προηγούμενο ερώτημα (δηλ. θα υπολογίσετε Ο( ) με παραμέτρους e τον αριθμό των ακμών και n τον αριθμό των κορυφών του γράφου). (15 μονάδες) 11. Στην άσκηση αυτή θα υλοποιήσουμε μια απλή έκδοση του Chord, του πιο γνωστού κατανεμημένου πίνακα κατακερματισμού (distributed hash table, DHT). Αν και πρόκειται για ένα κατανεμημένο δίκτυο, εμείς θα το υλοποιήσουμε σε ένα υπολογιστή. Το άρθρο που παρουσιάζει το Chord μπορεί να βρεθεί στον σύνδεσμο https://pdos.csail.mit.edu/papers/ton:chord/paper-ton.pdf. Χρειάζεται να διαβάσετε μέχρι τη σελίδα 6 ώστε να καταλάβετε τι είναι το Chord, πως οργανώνονται οι κόμβοι του, πως εισάγουμε ένα ζευγάρι (key,value) στο δίκτυο και πως βρίσκουμε την τιμή που αντιστοιχεί σε ένα δοσμένο κλειδί (lookup function). Επίσης υπάρχουν πολλές λεπτομερείς παρουσιάσεις και βίντεο για το Chord στον Παγκόσμιο Ιστό που μπορείτε να δείτε. Μετά πρέπει να ορίσετε ένα αφαιρετικό τύπο δεδομένων DHT που υλοποιεί το Chord και έχει την παρακάτω διεπαφή: void initialize(void). Η συνάρτηση αυτή δημιουργεί ένα δίκτυο Chord με τόσoυς κόμβους όση η τιμή μια σταθεράς MAXNODENUMBER. void insert(nodetype, keytype, valuetype). Η συνάρτηση αυτή ζητεί από ένα κόμβο με τύπο nodetype να εισάγει ένα ζευγάρι (key, value) με τύπους (keytype, valuetype) στο δίκτυο. valuetype lookup(nodetype, keytype). Η συνάρτηση αυτή ζητεί από ένα κόμβο με τύπο nodetype να βρει την τιμή που είναι
αποθηκευμένη στο δίκτυο για το κλειδί key που είναι τύπου keytype. valuetype smartlookup(nodetype, keytype). Η συνάρτηση αυτή είναι μια βελτιστοποίηση της προηγούμενης στην οποία οι κόμβοι του δικτύου χρησιμοποιούν ένα finger table. Θα πρέπει να γράψετε και μια συνάρτηση main η οποία θα επιδεικνύει τη λειτουργία του Chord. Παρατηρήσεις: (50 μονάδες) Οι λύσεις σας στα ερωτήματα που απαιτούν υλοποίηση πρέπει να είναι οργανωμένες σε modules της C όπως έχουμε συζητήσει στο μάθημα. Τα προγράμματα σας θα πρέπει να είναι όσο πιο καλά οργανωμένα γίνεται, σύμφωνα με όσα έχετε μάθει στο μάθημα «Εισαγωγή στον Προγραμματισμό». Τα προγράμματα σας πρέπει να «τρέχουν» στους υπολογιστές του Τμήματος με το λειτουργικό linux αφού μεταφραστούν με τον μεταγλωττιστή gcc. Πως να παραδώσετε τις λύσεις σας: Οι λύσεις θα πρέπει να σταλούν στο e-mail ddproj@di.uoa.gr μέχρι την προθεσμία παράδοσης και να είναι οργανωμένες ως εξής. Θα στείλετε ακριβώς ένα συμπιεσμένο αρχείο. Η λύση κάθε προβλήματος που απαιτεί υλοποίηση θα είναι σε χωριστό directory το οποίο θα περιλαμβάνει τα source files που χρειάζονται, και ένα Makefile το οποίο θα μπορεί να χρησιμοποιηθεί για να μεταγλωττιστούν τα αρχεία σας και να παραχθεί το αντίστοιχο executable. Θα πρέπει να υποβάλλετε και ένα αρχείο pdf στο οποίο θα περιέχονται οι απαντήσεις των θεωρητικών ερωτημάτων και το οποίο, για τα προγραμματιστικά ερωτήματα, θα περιέχει όσο documentation χρειάζεται ώστε οι βαθμολογητές να κατανοήσουν πλήρως τη λύση σας και να τη βαθμολογήσουν ανάλογα. Αυτό θα πρέπει να γίνει ανεξάρτητα με το αν είναι τα προγράμματα σας καλά σχολιασμένα, πράγμα που συνιστάται. Τέλος, το αρχείο pdf θα πρέπει
να ξεκινά με το όνομα σας γραμμένο με Ελληνικούς χαρακτήρες και τον αριθμό μητρώου σας. Καλή Επιτυχία!