ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ ΕΠΛ 035 - ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΓΙΑ ΗΛΕΚΤΡΟΛΟΓΟΥΣ ΜΗΧΑΝΙΚΟΥΣ ΚΑΙ ΜΗΧΑΝΙΚΟΥΣ ΥΠΟΛΟΓΙΣΤΩΝ Ακαδηµαϊκό έτος 2017-2018 Υπεύθυνος εργαστηρίου: Γεώργιος Χατζηπολλάς Εργασία 3 Δεντρικές Δοµές Δεδοµένων Οι περισσότερες γλώσσες προγραµµατισµού χρησιµοποιούν την κωδικοποίηση ASCII (Amrin Stnr Co for Informtion Intrhng). Στην κωδικοποίηση ASCII κάθε χαρακτήρας κωδικοποιείται µε τον ίδιο αριθµό από its, συγκεκριµένα 8. Αν θέλετε να δείτε την κωδικοποίηση ASCII τότε µπορείτε να επισκεφθείτε την ιστοσελίδα http://www.siitl.om/. Το επόµενο παράδειγµα δείχνει πως αντιπροσωπεύονται οι χαρακτήρες στη γλώσσα C. hr =''; printf("chr: %\tascii: %\n",, (int) ); Το αποτέλεσµα του πιο πάνω κώδικα είναι το εξής: Chr: ASCII:97 Πως όµως αποθηκεύονται οι πληροφορίες σε ένα αρχείο; Αφού κάθε χαρακτήρας µπορεί να αναπαρασταθεί από 8 its τότε σε κάθε αρχείο µε N χαρακτήρες χρειαζόµαστε Nx8its για να το αποθηκεύσουµε. Θεωρήστε το αρχείο input.txt το οποίο περιέχει αποθηκευµένη τη συµβολοσειρά. Κωδικοποίηση Χαρακτήρα Χαρακτήρας ASCII Δυαδική Μορφή 97 11100001 98 11100010 99 11100011 100 11100100 101 11100101 Για να αποθηκεύσουµε την συµβολοσειρά σε δυαδική µορφή (inry), θα χρειαστούµε να αποθηκεύσουµε το εξής: 11100001 11100010 11100001 11100001 11100011 11100010 11100100 11100001 11100011 11100101 Δηλαδή συνολικά θα χρειαστούµε 10x8its = 80 its για τη φύλαξη της συµβολοσειράς.
Υπάρχει καλύτερος τρόπος για να αποθηκεύσουµε αυτή την συµβολοσειρά; Η απάντηση είναι φυσικά ΝΑΙ και είναι η κωδικοποίηση. Αφού η συµβολοσειρά µας αποτελείται µόνο από 5 χαρακτήρες µπορούµε να δηµιουργήσουµε µία δική µας κωδικοποίηση η οποία να περιέχει κώδικες µόνο για τους 5 χαρακτήρες. Για να κωδικοποιήσουµε σε δυαδική µορφή τους αριθµούς 0 4 χρειαζόµαστε 3 its. Εφαρµόζοντας αυτό στο πιο πάνω παράδειγµα έχουµε το εξής αποτέλεσµα: Κωδικοποίηση Χαρακτήρα Χαρακτήρας Κωδικοποίηση Δυαδική Μορφή 0 000 1 001 2 010 3 011 4 100 Σε αυτή την περίπτωση για να αποθηκεύσουµε τη συµβολοσειρά σε δυαδική µορφή, θα χρειαστούµε να αποθηκεύσουµε το εξής: 000 001 000 000 010 001 011 000 010 100 Δηλαδή συνολικά θα χρειαστούµε 10x3its = 30 its. Η διαφορά είναι σηµαντική, ειδικά για µεγάλα αρχεία! Υπάρχει όµως ακόµη καλύτερος τρόπος για να αποθηκεύσουµε αυτή την συµβολοσειρά; Προσέξτε ότι χρησιµοποιήσαµε 3 its για κάθε χαρακτήρα άρα σταθερό µέγεθος. Τι θα συµβεί εάν χρησιµοποιήσουµε µεταβλητό µέγεθος κωδικοποίησης για κάθε χαρακτήρα; Η απάντηση είναι ΝΑΙ!!! Η κωδικοποίηση που θα υλοποιήσουµε βασίζεται σε ένα δέντρο κωδικοποίησης. Το δέντρο κωδικοποίησης είναι ένα δυαδικό δέντρο αναζήτησης όπου αποθηκεύει δυαδικές αναπαραστήσεις χαρακτήρων. Χρησιµοποιώντας το δέντρο αυτό, µία ακολουθία από χαρακτήρες µπορεί να κωδικοποιηθεί σε δυφία και αντίστροφα, µία ακολουθία από δυφία µπορεί να αποκωδικοποιηθεί σε χαρακτήρες. Το πλεονέκτηµα της κωδικοποίησης µε δέντρο κωδικοποίησης βρίσκεται στο γεγονός ότι δεν χρειάζεται να κωδικοποιούνται οι χαρακτήρες σε ένα σταθερό µέγεθος από its αλλά σε µεταβλητό. Σκεφτείτε το εξής τυχαίο δέντρο κωδικοποίησης.
Με αυτό το δέντρο παράγεται η εξής κωδικοποίηση: Κωδικοποίηση Χαρακτήρα Χαρακτήρας Κωδικοποίηση 01 10 000 001 11 Σε αυτή την περίπτωση για να αποθηκεύσουµε τη συµβολοσειρά σε δυαδική µορφή, θα χρειαστούµε να αποθηκεύσουµε το εξής: 01 10 01 01 000 10 001 01 000 11 Συνολικά θα χρειαστούµε 7x2its και 3x3 its = 23 its. (<30 its) Πως παράγεται όµως ένα δέντρο κωδικοποίησης; Η βασική λογική είναι ότι οι χαρακτήρες µε µεγάλη συχνότητα θα πρέπει να κωδικοποιούνται µε όσο το δυνατό λιγότερα δυφία, ώστε να µειώνεται όσο είναι δυνατό περισσότερο το τελικό αρχείο. Ο αλγόριθμος που θα υλοποιήσουμε παράγει ένα κώδικα βασισμένο στην πιθανότητα εμφάνισης του κάθε συμβόλου σε ένα κείμενο. Οι πιθανότητες εμφάνισης κάθε συμβόλου χρησιμοποιούνται για τη δημιουργία ενός πλήρους δυαδικού δέντρου από τα κάτω προς τα πάνω. Αυτός ο τρόπος εγγυάται ότι τα σύμβολα που εμφανίζονται λιγότερο συχνά θα έχουν μεγαλύτερο μέγεθος κωδικοποίησης. Στο δέντρο που θα δημιουργηθεί, τα σύμβολα (χαρακτήρες του αρχείου) θα βρίσκονται στα φύλλα, οι διακλαδώσεις σημειώνονται με 0 ή 1 και η δυαδική αναπαράσταση της διαδρομής από τη ρίζα του δέντρου μέχρι το σύμβολο είναι η συμπιεσμένη αναπαράστασή του ως σειρά δυαδικών ψηφίων. Βηματική περιγραφή Αλγόριθμου 1. Καταγραφή των χαρακτήρων του αρχείου και των αντίστοιχων συχνοτήτων εµφάνισης τους 2. Δηµιουργείται ένας κόµβος για κάθε σύµβολο στον οποίο σηµειώνεται και η αντίστοιχη συχνότητα εµφάνισης. Οι κόµβοι αυτοί εισάγονται σε µια δοµή δεδοµένων κατά αύξουσα σειρά συχνότητας εµφάνισης. Εάν δύο κόµβοι έχουν την ίδια πιθανότητα εµφάνισης προηγείται αυτός µε τη µικρότερη λεξικογραφική διάταξη 3. Επιλέγω τα 2 σύµβολα µε τις µικρότερες συχνότητες (έστω α και β). Αν υπάρχουν παραπάνω επιλογές, επιλέγω τα σύµβολα που προηγούνται λεξικογραφικά. Δηµιουργώ ένα δυαδικό δένδρο µε φύλλα αυτά τα 2 σύµβολα (τοποθετώντας αριστερά το σύµβολο με τη μικρότερη συχνότητα ή το μικρότερο λεξικογραφικά όνομα εάν η συχνότητα εμφάνισης είναι η ίδια) και πατέρα ένα καινούργιο σύµβολο µε όνοµα αβ και συχνότητα εµφάνισης το άθροισµα των συχνοτήτων εµφάνισης των συµβόλων α και β. Αφαιρώ τους κόµβους α και β από τη δοµή που φυλάγονται οι κόµβοι και προσθέτω τον κόµβο αβ 4. Επαναλαµβάνεται το 3ο βήµα µέχρι να µείνει µόνο ένας κόµβος στη δοµή (η ρίζα του δέντρου) µε πιθανότητα εµφάνισης 1.
Παράδειγµα δηµιουργίας δυαδικού δέντρου κωδικοποίησης Έστω η συµβολοσειρά εισόδου η οποία αποτελείται από 5 χαρακτήρες οι οποίοι επαναλαµβάνονται για τη δηµιουργία της. 1. Καταγραφή των χαρακτήρων του αρχείου και των αντίστοιχων συχνοτήτων εμφάνισης τους Χαρακτήρας Συχνότητα 2 2. Δημιουργείται ένας κόμβος για κάθε σύμβολο στον οποίο σημειώνεται και η αντίστοιχη συχνότητα. Οι κόμβοι αυτοί εισάγονται σε μια δομή κατά αύξουσα σειρά συχνότητας εμφάνισης. Εάν δύο κόμβοι έχουν την ίδια συχνότατα εμφάνισης προηγείται αυτός με τη μικρότερη λεξικογραφική διάταξη. Ο νέος κόμβος έχει ως όνομα τη σύνθεση των ονομάτων των δύο κόμβων που τον δημιουργούν και αριστερά στο δέντρο μπαίνει αυτός με τη μικρότερη συχνότητα ή το μικρότερο λεξικογραφικά όνομα εάν η συχνότητα εμφάνισης είναι η ίδια. 2 2 2 2 2 2 2
7/12 7/12 2 2 1 7/12 1 2 2 Σε αυτό το σηµείο έχει αποµείνει µόνο ένας κόµβος για επεξεργασία, άρα ο αλγόριθµος κωδικοποίησης έχει τερµατίσει. Για την κωδικοποίηση των συµβόλων θεωρούµε ότι κάθε µετάβαση από αριστερή ακµή συµβολίζεται µε 0 ενώ κάθε µετάβαση σε δεξιά ακµή συµβολίζεται µε 1. Ξεκινώ από τη ρίζα και σηµειώνω την ακολουθία από τα 0 και 1 µέχρις ότου καταλήξω σε ένα φύλλο. Δεδοµένου ότι τα φύλλα του δέντρου αντιπροσωπεύουν τα σύµβολα, οι ακολουθίες αυτές αποτελούν τις κωδικοποιήσεις των συµβόλων. Άρα, από το πιο πάνω δέντρο εξάγουµε την πιο κάτω κωδικοποίηση: Χαρακτήρας Συχνότητα 10 00 111 01 110
Λεπτοµέρειες Υλοποίησης 1. Το πρόγραµµά σας θα παίρνει ως παράµετρο από τη γραµµή εντολής το όνοµα του αρχείου που θα διαβαστεί/κωδικοποιηθεί (έστω input.txt) καθώς και το όνοµα του αρχείου µε τις κωδικοποιήσεις (έστω os.txt) κάθε χαρακτήρα. 2. Θα διαβάζει το αρχείο input.txt και θα εξάγει τις συχνότητες εµφάνισης κάθε χαρακτήρα που βρίσκεται σε αυτό. Θεωρείστε ότι στο αρχείο θα υπάρχουν µόνο οι χαρακτήρες του λατινικού αλφαβήτου, τα ψηφία 0 έως 9, ο χαρακτήρας της αλλαγής γραµµής και του τέλους του αρχείου. 3. Βάση των συχνοτήτων εµφάνισης θα πρέπει να δηµιουργήσετε το δέντρου κωδικοποίησης και στη συνέχεια να φυλάξετε στο αρχείο os.txt την κωδικοποίηση κάθε χαρακτήρα στη µορφή χαρακτήρας κενό κωδικοποίηση: 1001 011 001 4. Ακολουθήστε ρητά τις οδηγίες επιλογής των κόµβων για την επόµενη επανάληψη του αλγορίθµου κωδικοποίησης. Αξιολόγηση Εργασίας H προγραµµατιστική αυτή άσκηση είναι ατοµική και η µέγιστη δυνατή βαθµολογία είναι 100. Για την αξιολόγηση της προγραµµατιστικής αυτής άσκησης, θα ληφθούν οι πιο κάτω παράµετροι: 1. Δοµή Συστήµατος 5%: Το πρόγραµµά σας θα πρέπει να χρησιµοποιεί τεχνικές δοµηµένου προγραµµατισµού µε τη χρήση συναρτήσεων, αρχείων επικεφαλίδας (.h) και πολλαπλών αρχείων για καλύτερη δοµή του πηγαίου κώδικα και διαχείριση λαθών. 2. Ορθότητα Λειτουργίας 70%: Το πρόγραµµά σας θα πρέπει να υλοποιεί ορθά τις λειτουργίες του συστήµατος όπως αυτές περιγράφονται στην εκφώνηση. Ένα πρόγραµµα που δεν δίνει τη σωστή απάντηση δεν έχει καµιά αξία. Τα προγράµµατα θα πρέπει να δίνουν τη σωστή απάντηση για όλα τα στιγµιότυπα του πεδίου ορισµού του προβλήµατος που λύνουν, διαφορετικά δεν θα λάβουν (όλες) τις µονάδες που αντιστοιχούν στην ορθότητα. Βεβαιωθείτε ότι έχετε ελέγξει την ορθότητα του προγράµµατός σας πριν το παραδώσετε. 3. Επίδοση/Επεξήγηση Συστήµατος 25%: Το πρόγραµµά σας θα πρέπει να ελαχιστοποιεί τη χρήση των πόρων του συστήµατος και πιο συγκεκριµένα της µνήµης και του επεξεργαστή. Ο αλγόριθµος που χρησιµοποιείτε θα πρέπει να περιγράφεται µε σαφήνεια και ο κώδικας πρέπει να είναι καθαρά γραµµένος και να περιέχει επεξηγηµατικά σχόλια. 4. Η εργασία πιθανών να τύχει αξιολόγησης κατά τη διάρκεια του εργαστηρίου. Στην περίπτωση αυτή, θα πρέπει να είστε σε θέση να απαντήσετε σε ερωτήσεις που αφορούν την υλοποίησή σας και εάν σας ζητηθεί να αλλάξετε τον κώδικά σας έτσι ώστε να ικανοποιεί τις νέες απαιτήσεις που θα σας δοθούν κατά τη διάρκεια της εξέτασης. Αποτυχία στην απάντηση των ερωτήσεων θα οδηγήσει στον µηδενισµό της εργασίας. 5. Σε περίπτωση που το πρόγραµµά σας δεν βγάζει αποτέλεσµα ή έχει sgmnttion fult η µέγιστη βαθµολογία της εργασίας σας θα είναι 30. Οδηγίες Υποβολής Η εργασία θα παραδοθεί µόνο ηλεκτρονικά. Η παράδοση θα γίνει µέσω του BlkBor (EPL035_Ls). Προθεσµία: 4/11@23:59
Δηµιουργήστε ένα φάκελο στον υπολογιστή σας που θα έχει ως όνοµα µόνο την ταυτότητά σας. Τοποθετήστε σε αυτό τα ακόλουθα αρχεία:. Τα αρχεία µε τον πηγαίο κώδικα του προγράµµατός σας. Ένα αρχείο rm.txt το οποίο θα περιέχει τις οδηγίες χρήσης του προγράµµατός σας. Ένα αρχείο implmnttion.pf το οποίο θα περιγράφει τις επιλογές σας όσον αφορά τις δοµές δεδοµένων που έχετε επιλέξει να χρησιµοποιήσετε δικαιολογώντας τις αποφάσεις σας και τις διάφορες δυσκολίες που αντιµετωπίσατε (1-2 σελίδες). Ένα αρχείο poliplokotit.pf το οποίο θα περιέχει τη θεωρητική ανάλυση των διαδικασιών που έχετε υλοποιήσει. Για κάθε διαδικασία θα πρέπει να αναφέρεται την πολυπλοκότητα τόσο του χρόνου όσο και του χώρου που απαιτεί επεξηγώντας πλήρως τις απαντήσεις σας. ΚΑΛΗ ΕΠΙΤΥΧΙΑ