DOMES DEDOMENWN KAI ANALUSH ALGORIJMWN Fjinìpwro 2006 Didˆskwn: I. M lhc ParousÐash 8: Huffman Encoding Euˆggeloc DoÔroc 8.1 SumpÐesh Keimènou (Text Compression) Στον τομέα των υπολογιστών, παρά τη συνεχή αύξηση της χωρητικότητας των αποθηκευτικών μέσων και του διαθέσιμου εύρους ζώνης για τη μετάδοση των δεδομένων, καταβάλλονται σημαντικές προσπάθειες για την περαιτέρω αύξηση του όγκου των δεδομένων που μπορεί να διαχειριστούν. Κοινή συνισταμένη αυτών των προσπαθειών είναι η επίτευξη συμπίεσης κειμένου (text compression).ο όρος αυτός υποδηλώνει την τροποποίηση των περιεχομένων ενός αρχείου έτσι ώστε να απαιτείται λιγότερος χώρος να αποθηκευτεί ή/και λιγότερος χρόνος για να μεταδοθεί. Ταυτόχρονα όμως, πρέπει να διασφαλιστεί ότι η διαδικασία συμπίεσης θα είναι αντιστρεπτή. Με άλλα λόγια, θα υπάρχει η δυνατότητα πλήρους ανάκτησης του αρχικού αρχείου από τη συμπιεσμένη αναπαράστασή του. Η μη-αποδεκτή απώλεια δεδομένων αποτελεί την ειδοποιό διαφορά της συμπίεσης κειμένου από τη συμπίεση δεδομένων εν γένει. Σε περιοχές όπως η επεξεργασία σήματος και εικόνας, υπάρχει ανεκτικότητα για μικρή αλλοίωση των δεδομένων. Αυτό βεβαίως θα ήταν καταστροφικό σε ένα αρχείο κειμένου, εφόσον ουδείς θα ήταν πρόθυμος να χάσει ένα κομμάτι από το κείμενό του για να αποκτήσει τη δυνατότητα να το αποθηκεύσει ή/και να το μεταδώσει ταχύτερα. 8.2 Orismìc tou probl matoc - 1h lôsh: KwdikopoÐhsh StajeroÔ M kouc Θα δώσουμε έναν γενικό ορισμό του προβλήματος που καλούμαστε να αντιμετωπίσουμε, τον οποίο θα επαναδιατυπώσουμε φορμαλιστικά σε επόμενη ενότητα: Δοθέντος ενός αρχείου κειμένου, να βρεθεί ο πιο αποδοτικός τρόπος για την αναπαράστασή του σε δυαδική μορφή, όπου ο όρος αποδοτικός ισοδυναμεί με τον όρο οικονομικός, δηλαδή το κείμενό μας πρέπει να καταλαμβάνει το μικρότερο δυνατό χώρο. Ας υποθέσουμε ότι ένα αρχείου κειμένου αποτελείται από τη συμβολοσειρά ABRACADABRA.Επομένως, περιλαμβάνει 5 διαφορετικούς χαρακτήρες (A, B, C, D, R)και το μέγεθός του είναι 11 χαρακτήρες. Η αρχική ιδέα θα ήταν να αναπαραστήσουμε κάθε έναν από τους διαφορετικούς χαρακτήρες του κειμένου με το ίδιο πλήθος bits. Γενικά, είναι γνωστό ότι αν ένα κείμενο αποτελείται από Ν διαφορετικούς χαρακτήρες απαιτούνται [log N] bits για την αναπαράσταση κάθε διαφορετικού χαρακτήρα. Εν προκειμένω, Ν=6, άρα κάθε χαρακτήρας της συμβολοσειράς κωδικοποιείται με χρήση log 6 = 3 bits. Ετσι, αρκούν 3*11=33 bits για την αναπαράσταση της ακολουθίας με χρήση κωδικοποίησης σταθερού μήκους (fixed length encoding). 8.3 2h lôsh: KwdikopoÐhsh MetablhtoÔ M kouc Αναζητώντας κάποια καλύτερη κωδικοποίηση και παρατηρώντας πιο προσεχτικά τη δοσμένη συμβολοσειρά διαπιστώνουμε ότι ορισμένοι χαρακτήρες εμφανίζονται πολύ συχνότερα σε σχέση με κάποιους άλλους (για παράδειγμα ο χαρακτήρας A εμφανίζεται 5 φορές, ενώ ο C μόνο 1). Απόρροια αυτού του γεγονότος είναι η 8-1
8-2 lecture 8: Huffman Encoding σκέψη να χρησιμοποιούμε διαφορετικό πλήθος bits για την κωδικοποίηση των χαρακτήρων, ώστε αυτοί που εμφανίζονται συχνά να απαιτούν λιγότερα bits σε σχέση με τους πιο σπάνιους χαρακτήρες. Με βάση αυτή την προσέγγιση, δίνουμε την κάτωθι κωδικοποίηση για το παράδειγμά μας: A = 0, B = 100, C = 1010, D = 1011, R = 11. Αναφέρουμε εκ των προτέρων (και θα αποδείξουμε στη συνέχεια της αναφοράς) ότι η συγκεκριμένη κωδικοποίηση δεν είναι τυχαία, αλλά είναι η βέλτιστη δυνατή για τη συμβολοσειρά, εφόσον προκύπτει από τον αλγόριθμο του Huffman. Με την κωδικοποίηση αυτή, η συμβολοσειρά ABRACADABRA γράφεται στην ακόλουθη δυαδική μορφή: 01001101010010110100110. Ετσι, απαιτούνται πλέον μόνο 23 bits για την αναπαράσταση της ακολουθίας. Σε σύγκριση με τα 33 bits της πρώτης προσέγγισης, η κωδικοποίηση μεταβλητού μεγέθους (variable length encoding) επέφερε μια οικονομικότερη αναπαράσταση κατά ποσοστό της τάξεως του 30%. Ωστόσο, γενικά, η χρήση κωδικοποίησης μεταβλητού μήκους ελλοχεύει τον κίνδυνο διφορούμενης ανακατασκευ ής της αρχικής ακολουθίας, εφόσον η αποκωδικοποίηση της ροής των bits είναι πιθανό να οδηγεί σε περισσότερες της μιας ακολουθίες συμβόλων. Για παράδειγμα, ας υποθέσουμε ότι η κωδικοποίηση που έχουμε επιλέξει είναι A=01 και B=0101. Εστω ότι το bit stream που πρέπει να αποκωδικοποιηθεί είναι το 010101. Είναι προφανές ότι υπάρχουν 3 διαφορετικές συμβολοσειρές (οι AAA, AB και BA)που αντιστοιχούν σε αυτό. Ως εκ τούτου, η κωδικοποίηση που χρησιμοποιούμε είναι εσφαλμένη, εφόσον δεν εξασφαλίζει μοναδική ανακατασκευή της αρχικής συμβολοσειράς. Παρατηρώντας πιο προσεχτικά την κωδικοποίηση, διαπιστώνουμε ότι το πρόβλημα προκύπτει επειδή η δυαδική αναπαράσταση του A είναι πρόθεμα της αναπαράστασης του B. Ετσι, αποφασίζουμε από δω και στο εξής να χρησιμοποιούμε προθεματικούς κώδικες (prefix codes), μέσω των οποίων δεν επιτρέπεται σε μια κωδική λέξη να είναι πρόθεμα μιας άλλης κωδικής λέξης. 8.4 Idiìthtec Prefix Codes Οι prefix codes μπορούν να αναπαρασταθούν με τη βοήθεια ενός πλήρους δυαδικού δένδρου (full binary tree), στο οποίο κάθε εσωτερικός του κόμβος έχει ακριβώς βαθμό 2. Μέσω της αναπαράστασης αυτής, αποθηκεύουμε στα φύλλα του δένδρου ένα σύμβολο του αλφαβήτου, ενώ για κάθε εσωτερικό του κόμβο ερμηνεύουμε ως το ψηφίο 0 για το αριστερό του κλαδί και το ψηφίο 1 για το δεξί του. Με τη βοήθεια αυτής της σχέσης, μπορούμε να ορίσουμε την κωδική λέξη (codeword) ως μια διαδρομή από τη ρίζα του πλήρους δυαδικού δένδρου σε κάποιο φύλλο, ερμηνεύοντας κατάλληλα (με 0 και 1) τα κλαδιά του. Ας επανέλθουμε στη συμβολοσειρά ABRACADABRA και στην κωδικοποίηση A = 0, B = 100, C = 1010, D = 1011, R = 11. Επειδή έχουμε χρησιμοποιήσει prefix codes, μπορούμε να κατασκευάσουμε το πλήρες δυαδικό δένδρο που αντιστοιχεί σε αυτήν.
lecture 8: Huffman Encoding 8-3 εικόνα 8.1 Με τη βοήθεια του δένδρου της εικόνας 8.1, η διαδικασία αποκωδικοποίησης (decoding) είναι εξαιρετικά απλή. Αρκεί, δοθέντος ενός bit stream, να αρχίσουμε την ανάγνωσή του από αριστερά προς τα δεξιά και ξεκινώντας από τη ρίζα, όποτε συναντάμε ένα φύλλο, να σημειώνουμε το σύμβολο που αντιστοιχεί σε αυτό και να επιστρέφουμε στη ρίζα. Για παράδειγμα, ας υποθέσουμε ότι το bit stream είναι 0100. Εφαρμόζουμε τον παραπάνω κανόνα: Από τη ρίζα πηγαίνουμε στο αριστερό κλαδί ( bit 0) και καταλήγουμε σε φύλλο. Διαβάζουμε το σύμβολό του ( A), το σημειώνουμε και επιστρέφουμε στη ρίζα. Διαβάζουμε διαδοχικά τα 100 και φτάνουμε σε φύλλο. Καταγράφουμε το περιεχόμενό του ( B). Ετσι, η ακολουθία συμβόλων που αντιστοιχεί στο δοσμένο bit stream είναι η AB. 8.5 Formalistikìc Orismìc tou Probl matoc Εστω ένα αλφάβητο με n σύμβολα: Ορίζουμε ως f i τη συχνότητα εμφάνισης του ι-οστού συμβόλου ενός αλφαβήτου και d i το πλήθος των bits που απαιτούνται για την αναπαράστασή του (το οποίο είναι ισοδύναμο με το βάθος του συγκεκριμένου συμβόλου στο δένδρο). Το ερώτημα που γεννιέται είναι πώς θα μπορέσουμε να βρούμε το βέλτιστο κωδικό δένδρο, δηλ. εκείνο που θα ελαχιστοποιεί τη ποσότητα κόστος δένδρου, η οποία συμβολίζεται με C = n i=1 f id i ; Από τον ορισμό του προβλήματος, εξάγονται άμεσα τα ακόλουθα συμπεράσματα: ι) Οι συχνοί χαρακτήρες θα πρέπει να έχουν σύντομες κωδικές λέξεις. ιι) Οι σπάνιοι χαρακτήρες θα πρέπει να έχουν μεγάλες κωδικές λέξεις. Αν δεν ίσχυαν τα ι), ιι) τότε θα προέκυπτε κόστος δένδρου μεγαλύτερο από το μικρότερο δυνατό, ως εκ τούτου δε θα κατασκευάζονταν το βέλτιστο κωδικό δένδρο. Μελετώντας ακόμη προσεχτικότερα τον ορισμό του κόστους δένδρου, παρατηρούμε ότι οι χαρακτήρες του αλφαβήτου που έχουν τις δύο μικρότερες συχνότητες πρέπει να τοποθετηθούν στο τελευταίο επίπεδο του δυαδικού δένδρου, ως παιδιά του εσωτερικού κόμβου που απέχει περισσότερο από τη ρίζα. Πράγματι, ο ισχυρισμός αυτός είναι αληθής, εφόσον αν στο τελευταίο επίπεδο τοποθετούνταν δύο χαρακτήρες με μεγαλύτερες συχνότητες από τις δύο μικρότερες (οι οποίες θα βρίσκονταν ως παιδιού κάποιου εσωτερικού κόμβου που θα ήταν πιο κοντά στη ρίζα) τότε το κόστος δένδρου θα αυξάνονταν.
8-4 lecture 8: Huffman Encoding 8.6 Idèa Huffman - Kataskeu enìc K dika Huffman Αξιοποιώντας τις προηγούμενες παρατηρήσεις, ο διδάκτορας D. Huffman προχώρησε το 1952 στη δημοσίευση της εργασίας A Method for the Construction of Minimum Redundancy Codes, η οποία περιγράφει μια αποδοτική κατασκευή για τη βέλτιστη κωδικοποίηση ενός κειμένου. Η ομώνυμη τεχνική βασίζεται στην εφαρμογή ενός άπληστου αλγορίθμου ( greedy algorithm), ο οποίος χρησιμοποιεί μια προσέγγιση από κάτω προς τα πάνω ( bottom-up) για την κατασκευή του βέλτιστου κωδικού δένδρου. Η βασική αλγοριθμική ιδέα είναι η εξής: Οσο οι κόμβοι δεν έχουν συγχωνευθεί σε ένα δένδρο: Ι) Απομάκρυνε εκείνους τους κόμβους με τις δύο μικρότερες συχνότητες. ΙΙ) Δημιούργησε έναν καινούργιο εσωτερικό κόμβο, ο οποίος θα έχει παιδιά τους κόμβους που έχεις απομακρύνει στο προηγούμενο βήμα και συχνότητα το άθροισμα των συχνοτήτων τους. Ας προσπαθήσουμε να εφαρμόσουμε τα παραπάνω για τη συμβολοσειρά ABRACADABRA, δεχόμενοι ότι οι σχετικές συχνότητες εμφάνισης των συμβόλων της είναι: A: 40 B: 20 C: 10 D: 10 R: 20. Στο πρώτο βήμα, απομακρύνουμε τους κόμβους C και D εφόσον έχουν τη μικρότερη συχνότητα. Δημιουργούμε έναν εσωτερικό κόμβο (έστω ότι είναι ο new1), που θα έχει τα C και D παιδιά του και συχνότητα 10+10=20 (εικόνα 8.2). Στο δεύτερο βήμα, μπορούμε να απομακρύνουμε δύο εκ των τριών κόμβων B, R και new1, εφόσον έχουν την ίδια συχνότητα. Επιλέγουμε να δημιουργήσουμε έναν εσωτερικό κόμβο (έστω ότι είναι ο new2), που θα έχει τα B και new1 παιδιά του και συχνότητα 20+20=40 (εικόνα 8.3). Αξίζει να επισημάνουμε ότι αν είχαμε επιλέξει να συγχωνεύσουμε κάποιους άλλους κόμβους (π.χ. τους B και R) θα προέκυπτε κάποιο άλλο κωδικό δένδρο, το οποίο όμως θα είχε επίσης την ίδια τιμή για τη συνάρτηση κόστος του δένδρου. Με άλλα λόγια, ο αλγόριθμος Huffman δεν οδηγεί σε μοναδική κατασκευή ενός κωδικού δένδρου, αλλά όλες οι κατασκευές που δύναται να προκύψουν είναι βέλτιστες. εικόνα 8.2 εικόνα 8.3 Στο τρίτο βήμα, μπορούμε να απομακρύνουμε τον R και έναν από τους A και new2 που έχουν την ίδια συχνότητα. Επιλέγουμε να δημιουργήσουμε έναν εσωτερικό κόμβο (έστω ότι είναι ο new3), που θα έχει τα R και new2 παιδιά του και συχνότητα 40+20=60 (εικόνα 8.4). Στο τέταρτο και τελευταίο βήμα, δημιουργούμε το τελικό δένδρο, ενώνοντας τους κόμβους A και new3 και αντιστοιχίζοντας τα αριστερά κλαδιά με 0 και τα δεξιά κλαδιά με 1 (εικόνα 8.5). Πράγματι, παρατηρούμε ότι η κωδικοποίηση των συμβόλων που έχει προκύψει καθώς και το τελικό δένδρο είναι αυτά που είχαμε αναφέρει σε προηγούμενες ενότητες.
lecture 8: Huffman Encoding 8-5 εικόνα 8.4 εικόνα 8.5 8.7 Algìrijmoc Huffman kai Upologismìc thc Poluplokìthtac Η αλγοριθμική ιδέα του Ηυφφμαν συνοψίζεται αυστηρά στην κάτωθι μορφή: Procedure Huffman (X, f(.)) 1. n= X, the number of characters 2. for all x ɛ Q, enqueue ((x,f(x)),q) 3. for i=1 to n-1 4. allocate a new tree node z 5. leftchild =deletemin(q) 6. rightchild = deletemin(q) 7. f(z) = f(leftchild) + f(rightchild) 8. Make leftchild and rightchild the children of z 9. enqueue ((z,f(z)),q) Στον αλγόριθμο που παρουσιάστηκε, η είσοδος είναι το Χ δηλ. το σύνολο των συμβόλων που αποτελούν το αλφάβητο του δοθέντος κειμένου και το f(.) που περιλαμβάνει τις συχνότητες των συμβόλων. Τα ζευγάρια (x,f(x)) εισάγονται σε μια min-priority queue Q (ουρά μικρότερης προτεραιότητας), η οποία τα διατηρεί μονίμως ταξινομημένα σε φθίνουσα σειρά με βάση τη συχνότητά τους. Χρησιμοποιούμε min-priority queue και όχι έναν απλό πίνακα για την αποθήκευση των δεδομένων, γιατί επιθυμούμε τα στοιχεία να είναι ταξινομημένα σε κάθε βήμα και όχι μόνο την πρώτη φορά. Αναλύοντας την πολυπλοκότητα του αλγορίθμου του Huffman, δεχόμαστε ότι η min-priority queue έχει υλοποιηθεί με τη βοήθεια ενός δυαδικού σωρού (binary heap). Σε αυτή την περίπτωση είναι γνωστό ότι ο χρόνος που απαιτείται για τις πράξεις enqueue ((x,f(x)),q) και deletemin(q), που είναι οι πλέον κοστοβόρες
8-6 lecture 8: Huffman Encoding για τον αλγόριθμο, είναι O(logn). Ετσι, είναι εύκολο να συνάγουμε το συμπέρασμα ότι στη γραμμή 2 του αλγορίθμου το κόστος είναι O(nlogn), εφόσον η επανάληψη θα εκτελεστεί όσες φορές είναι η πληθικότητα του συνόλου δηλ. n. Ομοίως, στις γραμμές 3-9 που επαναλαμβάνονται n-1 φορές, η πολυπλοκότητα είναι επίσης O(nlogn). Ετσι, αποδεικνύεται ότι και η ολική πολυπλοκότητα του αλγορίθμου είναι της τάξεως του O(nlogn). 8.8 Orjìthta AlgorÐjmou Αποδεικνύεται ότι ο άπληστος αλγόριθμος του Huffman είναι ορθός, εφόσον πληροί τις ιδιότητες της άπληστης επιλογής (greedy choice) και βέλτιστης υπακολουθίας (optimal sub-structure).αυτό, επιβεβαιώνεται με τη βοήθεια των κάτωθι θεωρημάτων. Theorem 8.1 Εστω C ένα αλφάβητο στο οποίο κάθε χαρακτήρας c ɛ C έχει συχνότητα f(c). Εστω x, y ɛ C οι οποίοι έχουν τις μικρότερες συχνότητες. Τότε, υπάρχει ένα βέλτιστο κωδικό δένδρο για το C, στο οποίο οι κωδικές λέξεις για τα x, y έχουν το ίδιο μήκος (που είναι το μεγαλύτερο από κάθε άλλη κωδική λέξη) και διαφέρουν μόνο στο τελευταίο bit. Μέσω του θεωρήματος αυτού αποδεικνύεται η ικανοποίηση του κριτηρίου της άπληστης επιλογής. Με άλλα λόγια, εξασφαλίζεται ότι αν σε κάθε βήμα γίνεται η βέλτιστη επιλογή (εν προκειμένω να συγχωνεύονται οι δύο κόμβοι με τις μικρότερες συχνότητες) τότε το τελικό αποτέλεσμα (εδώ, το κωδικό δένδρο) θα είναι το βέλτιστο δυνατό. Theorem 8.2 Εστω C ένα αλφάβητο στο οποίο κάθε χαρακτήρας c ɛ C έχει συχνότητα f(c). Εστω x, y ɛ C οι οποίοι έχουν τις μικρότερες συχνότητες. Εστω C το αλφάβητο που ορίζεται ως C = C - {x,y} U {z}, όπου f[z] = f[x] + f[y]. Αν Τ, είναι ένα βέλτιστο κωδικό δένδρο για το C, τότε το δένδρο Τ, το οποίο θα προκύψει αν αντικαταστήσουμε το z με έναν εσωτερικό κόμβο που θα έχει παιδιά του τα x, y θα είναι το βέλτιστο κωδικό δένδρο για το αλφάβητο C. Με άλλα λόγια, με τη βοήθεια του θεωρήματος αυτού πιστοποιείται η ιδιότητα της optimal-substructure. Δηλαδή, η βέλτιστη λύση για ένα πρόβλημα (στο παράδειγμά μας το βέλτιστο κωδικό δένδρο) περιλαμβάνει τις βέλτιστες λύσεις για κάθε υποπρόβλημα. 8.9 Telikèc Parathr seic Μέσω της κωδικοποίησης Huffman επιτυγχάνεται κατά μέσο όρο συμπίεση της τάξεως του 37.5% χρησιμοποιώντας κατά μέσο όρο 5 bits για την αναπαράσταση κάθε χαρακτήρα. Η τεχνική αυτή, βρίσκει εφαρμογές πέρα από τη συμπίεση κειμένου και στην ψηφιακή μετάδοση των δεδομένων και χρησιμοποιείται ευρύτατα τόσο στις ασύρματες όσο και στις κινητές επικοινωνίες. Η χρήση κωδίκων Huffman δεν ενθαρρύνεται σε περιπτώσεις όπου το μέγεθος της κωδικοποιημένης ακολουθίας είναι ίδιας τάξης μεγέθους με αυτό του πίνακα κωδικοποίησης των συμβόλων. Αυτό συμβαίνει γιατί αν ο πίνακας αυτός δεν είναι εκ προοιμίου γνωστός, τότε θα πρέπει να συμπεριληφθεί στο κωδικοποιημένο μήνυμα, μειώνοντας δραστικά τη συμπίεση που επιτυγχάνεται. Ωστόσο, κάτι τέτοιο δε χρειάζεται να μας απασχολεί σε περιπτώσεις που υπάρχει διαθέσιμος ο κωδικός πίνακας των συμβόλων (πρακτικά σε κάθε αλφάβητο μπορεί να βρεθεί ο πίνακας με τη συχνότητα εμφάνισης των γραμμάτων του).
lecture 8: Huffman Encoding 8-7 BibliografÐa http://www.cis.upenn.edu/ matuszek/cit594-2005/lectures/43-huffman.ppt http://www.dcs.warwick.ac.uk/ czumaj/cs301/lecture-10-cis-301.ppt S. Dasgupta, C. Papadimitriou, U. Vazirani, Algorithms http://www.cs.berkeley.edu/ luca/cs170/notes/lecture15.pdf T. Cormen, C. Leiserson, R. Rivest, C. Stein, Introduction to Algorithms, MIT Press, 2nd edition, 2001 http://www.cs.dartmouth.edu/ rahul/teaching/huffman.ppt