ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010 11 Ιστοσελίδα μαθήματος: http://eclass.teilam.gr/di288 1 Συμπίεση αρχείων 7ο ΕΡΓΑΣΤΗΡΙΟ Με τον όρο συμπίεση αρχείου χαρακτηρίζεται η διαδικασία αλλαγής της αναπαράστασης ενός αρχείου έτσι ώστε να καταλαμβάνει μικρότερο χώρο στο αποθηκευτικό μέσο ή να χρειάζεται λιγότερο χρόνο μετάδοσης, ενώ, ταυτόχρονα, να είναι δυνατή η αποκατάσταση της αρχικής μορφής από την συμπιεσμένη. Η συμπίεση με αυτές τις ιδιότητες ονομάζεται συμπίεση χωρίς απώλειες(lossless) σε αντιδιαστολή με την συμπίεση με απώλειες(lossy) η οποία χρησιμοποιείται κατά την κωδικοποιήση ορισμένων τύπων δεδομένων, όπως εικόνων jpeg. Οι αλγόριθμοι συμπίεσης εκμεταλλεύονται δύο χαρακτηριστικά των αρχείων: την περιοδικότητα και την ανισοκατανομή στις συχνότητες εμφάνισης χαρακτήρων ή block χαρακτήρων. 1.1 Κωδικοποίηση μήκους επανάληψης Η απλούστερη ιδέα συμπίεσης βασίζεται στο γεγονός ότι ορισμένα αρχεία περιέχουν μακριές ακολουθίες από επαναλαμβανόμενους χαρακτήρες. Παράδειγματος χάριν η επόμενη ακολουθία εμφανίζει πολλές επαναλήψεις. AAAABBBBAAAAABBBBBBCCCCCCCCCCCCCCBBABAAAABBBBBBCCCCD Αυτή η ακολουθία μπορεί να αποθηκευθεί σε πιο συμπιεσμένη μορφή, αντικαθιστώντας κάθε επαναλαμβανόμενη υποακολουθία χαρακτήρων από ένα αντίγραφο του χαρακτήρα και από ένα αριθμό που δηλώνει πόσες φορές επαναλαμβάνεται. Αυτός ο τρόπος συμπίεσης ονομάζεται κωδικοποίηση μήκους επανάληψης. Για παράδειγμα, η προηγούμενη ακολουθία μπορεί να κωδικοποιηθεί ως εξής: 4A4B5A6B14C2B1A1B4A6B4C1D Παρατηρούμε ότι δεν αξίζει να κωδικοποιούμε επαναλήψεις ενός ή δύο χαρακτήρων, αφού χρειάζονται δύο χαρακτήρες για την κωδικοποίηση. Για τα δυαδικά αρχεία(που περιέχουν μόνο 0 ή 1) χρησιμοποιείται μια τροποποιημένη έκδοση αυτής της μεθόδου. Η ιδέα είναι να αποθηκεύουμε μόνο τα μήκη της επανάληψης, εκμεταλευόμενοι το γεγονός ότι οι επαναλήψεις διαφοροποιούνται από 0 σε 1, αποφεύγοντας να αποθηκεύσουμε τα 0 και 1 καθαυτά. Για παράδειγμα, η επόμενη δυαδική λέξη 0000000000111000000111110000000001111111111111100000000000 μπορεί να κωδικοποιηθεί από την ακολουθία: 10,3,6,5,9,14,11 Προφανώς, το μειονέκτημα τις κωδικοποίησης επανάληψης είναι ότι απαιτεί χωριστές αναπαραστάσεις για το αρχείο που θα κωδικοποιηθεί και για την κωδικοποιημένη έκδοσή του, και έτσι δεν μπορεί να δουλεύει για όλα τα αρχεία(π.χ. σε αρχεία με αριθμητικά σύμβολα). Ετσι απαιτεί την ύπαρξη ειδικών χαρακτήρων που ονομάζονται χαρακτήρες διαφυγής escape characters. 1
1.2 Κωδικοποίηση Huffman Η κωδικοποίηση Huffman είναι μια κωδικοποίηση μεταβλητού μήκους. Οι χαρακτήρες με περισσότερες εμφανίσεις κωδικοποιούνται από λέξεις με μικρότερο μήκος απ ότι οι χαρακτήρες με λιγότερες εμφανίσεις. Το σύνολο αυτών των λέξεων ονομάζεται κώδικας Huffman. Ενας κώδικας με την ιδιότητα ότι καμιά λέξη του δεν είναι πρόθεμα μιας άλλης λέξης του ονομάζεται προθεματικός κώδικας(prefix code). Κάθε προθεματικός κώδικας μπορεί να αναπαρασταθεί(και να κατασκευασθεί χρησιμοποιώντας ένα (πλήρες)δυαδικόδένδρο,όπουσεκάθεαριστερόδεσμόθέτουμε 0καισεκάθεδεξιόδεσμό 1.Τασύμβολα είναι στα φύλλα του δένδρου και η λέξη του κώδικα που αντιστοιχεί στο σύμβολο παράγεται με ένα μονοπάτι από τη ρίζα προς το αντίστοιχο φύλλο. Τοεπόμενοδυαδικόδένδροαντιστοιχείσεέναπροθεματικόκώδικαγιατασύμβολα A, B, Cκαι D. A B C D Στο Aαντιστοιχείτο 0,στο Bτο 100,στο Cτο 101καιστο Dτο 11. Ετσι, η λέξη AABCDABBC κωδικοποείται από την ακολουθία 00100101110100100101 Η αποκωδικοποίηση κάθε ακολουθίας από bits είναι μοναδική: Αρχίζουμε από την ρίζα, και διαβάζουμε την ακολουθία από αριστερά προς δεξιά. Κινούμαστε προς το αριστερό ή το δεξιο παιδί κάθε κόμβου αν διαβάζουμε 0 ή 1 αντίστοιχα. Μόλις φτάσουμε σε φύλλο προκύπτει το αντίστοιχο σύμβολο και επιστρέφουμε στη ρίζα. Συνεχίζουμε μέχρις ότου εξαντλήσουμε την ακολουθία. Ετσι, η ακολουθία 0111011011110000100 κωδικοποιεί την λέξη A D C C D B A A B 1 101 101 11 100 0 00 Προφανώς, το μήκος της κωδικοποιημένης ακολουθίας εξαρτάται από τον προθεματικό κώδικα. Για παράδειγμα, ένα αρχείο στο οποίο εμφανίζονται οι χαρακτήρες A,B,C και D με τις επόμενες συχνότητες Σύμβολο Συχνότητα Κώδικας A 70 εκατομμύρια 0 B 3 εκατομμύρια 100 C 20 εκατομμύρια 101 D 37 εκατομμύρια 11 κωδικοποείται, με βάση τον προηγούμενο προθεματικό κώδικα, από μια δυαδική λέξη με μήκος 70 1+3 3+20 3+37 2 = 213 megabits Αντίθετα, αν χρησιμοποιούσαμε ASCII κωδικοποίηση θα απαιτούνταν 8 130 = 1040 megabits, ενώ αν χρησιμοποιούσαμε κωδικοποίηση σταθερού μήκους για παράδειγμα αν κωδικοποιούσαμε τα A, B, C και D με 00, 01, 10και 11αντίστοιχαθααπαιτούνταν 2 130=260 megabits. Μεδεδομένεςτιςσυχνοτήτεςεμφάνισης f 1, f 2,..., f n για nσύμβολα,οαλγόριθμοςτου Huffman υπολογίζει τον βέλτιστο προθεματικό κώδικα ώστε η κωδικοποίηση να έχει όσο το δυνατόν μικρότερο μήκος. Η υλοποίηση του αλγορίθμου του Huffman γίνεται με τη βοήθεια μιας ουράς προτεραιότητας Q με στοιχεία τις κορυφές του προθεματικού δένδρου και κλειδιά τις τιμές των συχνοτήτων κάθε κορυφής. 2
Αλγόριθμος Huffman Είσοδος: Ενας πίνακας συχνοτήτων F Εξοδος: Ενα δυαδικό δένδρο με n φύλλα Τα βήματα του αλγορίθμου Huffman είναι τα εξής: Αρχικά τοποθετούνται όλα τα σύμβολα ως κορυφές στην ουρά Q. Οσο η ουρά περιέχει τουλαχιστον δύο κορυφές. Αφαίρεσε δύο κορυφές με τις μικρότερες συχνότητες. Θέσε τις κορυφές αυτές ως παιδιά μιας νέας κορυφής. Θέσε ως συχνότητα αυτής της κορυφής το άθροισμα των παιδιών της. Πρόσθεσε αυτή την κορυφή στην ουρά προτεραιότητας. Παράδειγμα Γιακάποιααλυσίδα DNAπουαποτελείταιαπότιςβάσεις A, C, G, T είναιγνωστόότιοισυχνότητες εμφάνισης των βάσεων είναι 31%, 20%, 9% και 40% αντίστοιχα. Η εκτέλεση του αλγορίθμου του Huffman στο παράδειγμα αυτό είναι η εξής: 1. Οπίνακαςσυχνοτήτωνέχειπεριέχειτιςτιμές [31,20,9,40] Αρχικά, το δυαδικό δένδρο είναι κενό. Η ουρά προτεραιότητας είναι κενή. 2. Τοποθετούμεόλατασύμβολαστηνουρά Q 31 20 9 40 Q=[ A C G T ] 3. Αφαιρούμετα Cκαι Gπουέχουνταμικρότερακλειδιά 9και 20 31 40 Q=[ A T ] 4. Θέτουμετα Cκαι Gωςπαιδιάτης v 1 μεσυχνότητα 20+9 = 29. 0 0101 5. Εισάγουμετην v 1 στηνουρά Q. 31 40 Q=[ A T ] 31 40 29 Q=[ A T v 1 ] 3
6. Αφαιρούμετα Aκαι v 1 πουέχουνταμικρότερακλειδιά 31και 29 0 01 40 Q=[ T ] 7. Θέτουμετα A, v 1 ωςπαιδιάτης v 2 μεσυχνότητα 31+29 = 60. v 2 [60] 0 01 40 Q=[ T ] 8. Εισάγουμετην v 2 στηνουρά Q. v 2 [60] 40 60 Q=[ T v 2 ] 4
9. Αφαιρούμετα T, v 2 πουέχουνταμικρότερακλειδιά 40, 60 v 2 [60] Q=[ ] 10.Θέτουμετα T, v 2 ωςπαιδιάτης v 3 μεσυχνότητα 40+60 = 100. T[40] v 2 [60] Q=[ ] 11.Εισάγουμετην v 3 στηνουρά Q. T[40] v 2 [60] 100 Q=[ v 3 ] 5
12. Η ουρά έχει λιγότερα από δύο στοιχεία, τέλος. T[40] v 2 [60] C[20] G[9] 100 Q=[ v 3 ] Το μειονέκτημα της κωδικοποίησης Huffman είναι ότι απαιτεί από την αρχή την γνώση των συχνοτήτων εμφάνισης κάθε χαρακτήρα, επομένως χρειάζεται τροποποίηση για να εφαρμοστεί σε streaming αρχεία. Ασκήσεις 1. Μιααλυσίδα DNAμήκους100.000.000αποτελείταιαπότιςβάσεις A, C, G, T. Η Aέχει 5.000.000 εμφανίσεις, η C 25.000.000 εμφανίσεις, η G 60.000.000 εμφανίσεις και η T 10.000.000 εμφανίσεις. Να βρεθεί ο βέλτιστος προθεματικός κώδικας για την αποθήκευση αυτής της αλυσίδας. 2. Να βρεθεί ο βέλτιστος προθεματικός κώδικας Huffman για κάθε μια από τις επόμενες φράσεις(και στη συνέχεια να βρεθεί το μήκος της κάθε μιας κωδικοποιημένης φράσης) i. ΜΗΝΙΝ ΑΕΙΔΕ ΘΕΑ ΠΗΛΗΙΑΔΕΩ ΑΧΙΛΗΟΣ ΟΥΛΟΜΕΝΗΝ Η ΜΥΡΙ ΑΧΑΙΟΙΣ ΑΛΓΕ ΕΘΗΚΕ ii. ΤΟΥ ΚΥΚΛΟΥ ΤΑ ΓΥΡΙΣΜΑΤΑ ΠΟΥ ΑΝΕΒΟΚΑΤΕΒΑΙΝΟΥ ΚΑΙ ΤΟΥ ΤΡΟΧΟΥ ΠΟΥ ΩΡΕΣΨΗΛΑΚΙΩΡΕΣΣΤΑΒΑΘΗΠΗΑΙΝΟΥ iii. ΝΟΟΣ ΝΟΕΡΟΥ ΝΟΕΡΩΣ ΤΩ ΗΜΕΤΕΡΩ ΝΟΙ ΣΥΛΛΑΛΗΣΑΝΤΟΣ iv. ΝΕΡΟ ΛΙΝΑΡΙ ΝΕΡΟΛΙΝΑΡΟ ΝΕΡΟΚΑΘΑΡΟΛΙΝΑΡΟ v. ΝΙΨΟΝ ΑΝΟΜΗΜΑΤΑ ΜΗ ΜΟΝΑΝ ΟΨΙΝ vi. λοπαδοτεμαχοσελαχογαλεοκρανιολειψανοδριμυποτριμματοσιλφιοκαραβομελιτοκατακεχυμενοκιχλεπικοσσυφοφαττοπεριστεραλεκτρυονοπτοκεφαλλιοκιγκλοπελειολαγωοσιραιοβαφητραγανοπτερύγων (η μεγαλυτέρη ελληνική λέξη, πιάτο φαγητού, Αριστοφάνης, Εκκλησιάζουσες) 3. Να βρεθεί ο βέλτιστος προθεματικός κώδικας Huffman για την φράση ΟΝΟΜΑ ΕΠΩΝΥΜΟ ΤΟΥ ΠΑΤΡΟΝΥΜΟ στην οποία θα χρησιμοποιήσετε τα δικά σας στοιχεία και στη συνέχεια να κωδικοποιηθει. 6