Data Compression and Algorithms
Συμπίεση (1) στην αποθήκευση στην μεταφορά δεδομένων μέσα από δίκτυα στην διαχείριση τους Οι μέθοδοι συμπίεσης διακρίνονται σε: Μεθόδους χωρίς απώλεια πληροφορίας που χρησιμοποιούν μη απωλεστικούς (lossless) αλγορίθμους. Οι συγκεκριμένες μέθοδοι συμπιέζουν τα δεδομένα με τέτοιοι τρόπο, ώστε να μην υπάρχει απώλεια πληροφορίας, ενώ επιτυγχάνουν μέτριο λόγο συμπίεσης. Έτσι μία εικόνα που συμπιέστηκε με μια τέτοια μέθοδο είναι ίδια με την αρχική, όταν αποσυμπιεστεί. Μεθόδους με απώλεια πληροφορίας που συμπιέζουν τα δεδομένα απορρίπτοντας μη ουσιώδη πληροφορία. Οι συγκεκριμένες μέθοδοι χρησιμοποιούν απωλεστικούς (lossy) αλγορίθμους και επιτυγχάνουν υψηλό λόγο συμπίεσης.
Συμπίεση (2) Κωδικοποίηση Εντροπίας (entropy coding) Μία απλοποιημένη ταξινόμηση των τεχνικών συμπίεσης είναι: Κωδικοποίηση Εντροπίας (entropy coding) - δεν λαμβάνεται υπόψη το είδος της πληροφορίας που θα συμπιεστεί - αντιμετωπίζεται η πληροφορία ως απλή ακολουθία bits - κωδικοποίηση χωρίς απώλειες Κωδικοποίηση Πηγής (source encoding) - οι μετασχηματισμοί που υφίσταται το αρχικό σήμα εξαρτώνται άμεσα από το τύπο του - μπορούν να παράγουν μεγαλύτερα ποσοστά συμπίεσης - μειονεκτούν σε σταθερότητα - λειτουργεί με απώλειες και χωρίς απώλειες.
Συμπίεση (3) Τεχνικές Κωδικοποίησης Εντροπίας - περιορισμός επαναλαμβανόμενων ακολουθιών - στατιστική κωδικοποίηση Τεχνικές Κωδικοποίησης Πηγής - κωδικοποίηση μετασχηματισμού - διαφορική ή προβλεπτική κωδικοποίηση - διανυσματική κβαντοποίηση.
Κωδικοποίηση Μετασχηματισμού Η κωδικοποίηση μετασχηματισμού χρησιμοποιείται συνήθως στη συμπίεση εικόνων. Στη κωδικοποίηση μετασχηματισμού, το σήμα υφίσταται ένα μαθηματικό μετασχηματισμό από το αρχικό πεδίο του χρόνου ή του χώρου σε ένα αφηρημένο πεδίο το οποίο είναι πιο κατάλληλο για συμπίεση. Αυτή η διαδικασία είναι αντιστρεπτή, δηλαδή υπάρχει ο αντίστροφος μετασχηματισμός που θα επαναφέρει το σήμα στην αρχική του μορφή. Ένα τέτοιος μετασχηματισμός είναι ο μετασχηματισμός Fourier. Μέσω του μετασχηματισμού Fourier μια συνάρτηση του χρόνου f(t) μπορεί να μετασχηματιστεί σε μια g(λ) στο πεδίο των συχνοτήτων. Στη φασματική (στο πεδίο των συχνοτήτων) αναπαράσταση των εικόνων, οι συχνότητες περιγράφουν πόσο γρήγορα μεταβάλλονται τα χρώματα και η απόλυτη φωτεινότητα. Εκτός από τον μετασχηματισμό Fourier υπάρχουν και άλλοι, όπως οι μετασχηματισμοί των Hadamar, Haar και των Karhunen-Loeve. Ανάλογα με τις ιδιότητες του τύπου της πληροφορίας που θέλουμε να συμπιέσουμε, επιλέγουμε και τον καταλληλότερο μετασχηματισμό.
Διαφορική Κωδικοποίηση 1. Απλή Διαφορική Παλμοκωδική Διαμόρφωση (DPCM) Η διαφορική παλμοκωδική διαμόρφωση είναι η πιο απλή από τις τρεις μορφές διαφορικής κωδικοποίησης. Η προβλεπόμενη τιμή κάθε δείγματος είναι απλά η τιμή του προηγούμενου δείγματος. 2. Δέλτα Διαμόρφωση Στη δέλτα διαμόρφωση, η διαφορά μεταξύ της προβλεπόμενης και της τρέχουσας τιμής του δείγματος κωδικοποιείται με ένα μόνο bit. Αυτό σημαίνει ότι κάθε δείγμα μπορεί να είναι είτε μεγαλύτερο είτε μικρότερο κατά ένα κβάντο από το προηγούμενο του. Η δέλτα διαμόρφωση είναι κατάλληλη για σήματα χαμηλών συχνοτήτων. 3. Προσαρμοστική Διαφορική Παλμοκωδική Διαμόρφωση Στην ADPCM, αντί να χρησιμοποιείται ένας σταθερός μηχανισμός πρόβλεψης, χρημοποιείται ένας δυναμικός μηχανισμός που προσαρμόζεται ανάλογα με τα χαρακτηριστικά του προς δειγματοληψία σήματος. Κατά τα άλλα, όπως και στην απλή DPCM, μόνο η διαφορά μεταξύ της πραγματικής και της προβλεπόμενης τιμής κάθε δείγματος μεταδίδεται. .
Διανυσματική Κβαντοποίηση Το ρεύμα δεδομένων χωρίζεται σε τμήματα που ονομάζονται διανύσματα. Για παράδειγμα, αν τα δεδομένα μας αποτελούν μια εικόνα, κάθε διάνυσμα μπορεί να είναι ένα τετράγωνο ή παραλληλόγραμμο τμήμα της εικόνας. Υποθέτουμε ότι όλα τα διανύσματα έχουν το ίδιο μικρό μέγεθος και ότι αποτελούνται από πλειάδες. Υπάρχει ένας πίνακας που περιέχει ένα σύνολο από πρότυπα διανύσματα. Αυτός ο πίνακας αποτελεί το λεξικό της μεθόδου και πρέπει να είναι διαθέσιμο τόσο κατά την συμπίεση, όσο και την αποσυμπίεση των δεδομένων. Το λεξικό μπορεί να είναι προκαθορισμένο, δηλαδή το ίδιο σε όλες τις διαδικασίες συμπίεσης ή δυναμικό. Στην τελευταία περίπτωση, κάθε φορά που ξεκινά η συμπίεση των δεδομένων, ένα νέο λεξικό δημιουργείται. . Η συμπίεση έγκειται στην αντικατάσταση κάθε διανύσματος της αρχικής πληροφορίας με το πιο ταιριαστό από τα πρότυπα του λεξικού. Κάνοντας χρήση του λεξικού, αντί για ολόκληρα τα πρότυπα, μόνο η ετικέτα τους ή ο αύξων αριθμός τους στο λεξικό είναι απαραίτητο να αποθηκευτεί.
Συμπίεση Κειμένου Αλγόριθμοι συμπίεσης Μοντέλα για πρόβλεψη των πιθανοτήτων εμφάνισης των διαφόρων συμβόλων Κάτω όριο συμπίεσης
Μοντέλα Στατικά Ημιστατικά Προσαρμοστικά ή δυναμικά
Προσαρμοστικά Μοντέλα PPM (Prediction by Partial Matching) Burrows-Wheeler (μετασχηματισμός) Markov Models Word-based Compressors (διαφορετικό μοντέλο για λέξεις και διαφορετικό μοντέλο για αναπαράσταση κενών (αν υπάρχουν))
PPM Model PPMA: escape method A, το escape σύμβολο παίρνει το 1 ως συχνότητα εμφάνισης στη συμπίεση PPMC: η πιθανότητα του escape γίνεται r/(n+r), όπου r είναι ο αριθμός των διακριτών όρων, και n είναι ο συνολικός αριθμός προηγουμένως εμφανιζομένων συμβόλων PPMD: δίνει μόνο το μισό βάρος σε διακριτές εμφανίσεις, οπότε το escape σύμβολο παίρνει βάρος r/(2n), και η πιθανότητα ενός συμβόλου που έχει εμφανιστεί ci φορές γίνεται (2ci-1)/(2n) Method_X: η συχνότητα εμφάνισης των λέξεων που έχουν εμφανιστεί μία φορά (hapax legomena) χρησιμοποιείται για εκτίμηση της πιθανότητας εμφάνισης του ESCAPE συμβόλου (εάν t1 τότε η συχνότητα εμφάνισης γίνεται (t1+1)/(n+t1+1), και για ένα σύμβολο γίνεται ci/(n+t1+1). PPM* : γενική παραμετροποιημένη μέθοδος.
Περιγραφή του Burrows Wheeler (1) Ευθύς μετασχηματισμός: Η είσοδος του αλγορίθμου είναι η s. Προσθέτουμε ένα ειδικό σύμβολο • (που υποδηλώνει το τέλος της συμβολοσειράς) στο τέλος της s και το οποίο είναι μικρότερο από κάθε σύμβολο του Α, Σχηματίζουμε έναν (n+1) x (n+1) πίνακα T με στοιχεία τα σύμβολα του της συμβολοσειράς s. Στην 1η γραμμή του πίνακα βάζουμε το s•, στη 2η γραμμή την αριστερή κυκλική μετατόπιση (κατά μία θέση) της 1ης (γραμμής) κ.ο.κ. Διατάσουμε λεξικογραφικά τις συμβολοσειρές των γραμμών από τα δεξιά προς τα αριστερά . Τελικά η 1η στήλη του πίνακα T χωρίς το • δίνει την έξοδο του μετασχηματισμού (bwt(s). Η έξοδος είναι το bwt(s) και ένας δείκτης Ι στη γραμμή που είχε το • σαν 1ο στοιχείο.
Περιγραφή του Burrows Wheeler (2) Ευθύς μετασχηματισμός: Στον παρακάτω πίνακα φαίνεται ο T για s=mississippi. H έξοδος είναι: msspipissii και I=3
Περιγραφή του Burrows Wheeler (3) Αντίστροφος μετασχηματισμός: Είσοδος: το bwt(s) και τον δείκτη Ι Έξοδος: η s Βασίζεται στις ακόλουθες ιδιότητες του BWT: 1) Όλες οι στήλες του πίνακα που ορίσαμε είναι μεταθέσεις των συμβόλων της s. 2) Για κάθε i = 2,3,…,n+1 ο χαρακτήρας στη θέση (i,n+1) προηγείται άμεσα (δηλαδή είναι ο αμέσως προηγούμενος) του (i,1) στη s. 3) Για κάθε χαρακτήρα η i-οστή εμφάνισή του στην 1η στήλη του πίνακα αντιστοιχεί στην i-οστή εμφάνισή του και στην τελευταία στήλη (δηλαδή στις θέσεις αυτές αναφέρεται το ίδιο σύμβολο).
Περιγραφή του Burrows Wheeler (4) Αντίστροφος μετασχηματισμός: Διατάσσουμε τα στοιχεία του bwt(s) κατά αύξουσα σειρά (ουσιαστικά παίρνουμε τη τελευταία στήλη L) Αφού το • είναι το μικρότερο από όλα τα σύμβολα του Α θα εμφανίζεται 1ο . Από την 2η παρατήρησή μας προκύπτει άμεσα ότι το 1ο σύμβολο της bwt(s) είναι 1ο και στην s. Από την 3η παρατήρηση βρίσκουμε τη θέση του συγκεκριμένου συμβόλου στη L οπότε χρησιμοποιώντας και πάλι τη 2η παρατήρηση βρίσκουμε το επόμενο σύμβολο της s. Συνεχίζοντας με τον ίδιο τρόπο ως το • βρίσκουμε τελικά την s. Το σημαντικό είναι ότι δε χρειάζεται ο T!!!
Περιγραφή του Burrows Wheeler (5) mississippi• mississippi• ississippi•m ssissippi•mi ssissippi•mi •mississippi sissippi•misissippi•miss ssippi•missi sippi•missis ippi•mississ ppi•mississi pi•mississip i•mississipp •mississippi ssippi•missi ppi•mississi ississippi•m pi•mississip i•mississipp sissippi•mis sippi•missis issippi•missippi•mississ
Περιγραφή του Burrows Wheeler (6) Θέτουμε το bw(s) να είναι η πρώτη στήλη του διατεταγμένου πίνακα χωρίς το σύμβολο Η έξοδος του BWT είναι το bw(s) και ο δείκτης Ι που δείχνεί τη θέση που βρίσκεται το στο bw(s) m ississippi• s sissippi•mi • mississippi s sippi•missi - Στο παράδειγμα μας είναι bw(s) = msspipissii p pi•mississi i ssissippi•m p i•mississip i •mississipp s issippi•mis s ippi•missis i ssippi•miss i ppi•mississ και Ι=3
Περιγραφή του Burrows Wheeler (7) Βήματα-Παρατηρήσεις Εισάγουμε το στη θέση Ι του bw(s) παίρνοντας την πρώτη στήλη F διατεταγμένου πίνακα Διατάσσοντας τα στοιχεία του bw(s) λαμβάνουμε την τελευταία στήλη L του διατεταγμένου πίνακα Για κάθε i=2,…,|s|+1, το Fi είναι το σύμβολο που ακολουθεί το Li στο s
Παράδειγμα: s = m i s sissippi Η συμβολοσειρά F : 1 2 3 4 5 6 7 8 9 10 11 12 F m s p i L s = m i s sissippi
Compression Algorithms Περιγραφή αλγορίθμων συμπίεσης κειμένου: Huffman Coding (Static & Dynamic) Arithmetic Coding LZW Coding
Static Huffman Coding Η μέθοδος Huffman είναι ένας στατιστικός τρόπος κωδικοποίησης. Η κωδικοποίηση του κειμένου αφορά την αντικατάσταση κάθε συμβόλου με μία κωδική λέξη. Χρησιμοποιεί την έννοια του prefix code. Αναποτελεσματική τεχνική (ερμηνεία;): Pr(s1)+log(2loge/e)=Pr(s1)+0.086
Κωδικοποίηση Η κωδικοποίηση αποτελείται απο 3 βήματα: Μέτρηση των συχνοτήτων εμφάνισης των χαρακτήρων Κατασκευή του prefix code Κωδικοποίηση του κειμένου
1ο Βήμα: Μέτρηση Συχνοτήτων Εμφάνισης Χαρακτήρων Κατά το 1ο βήμα του αλγορίθμου μετρώνται οι συχνότητες εμφάνισης των χαρακτήρων στο αρχικό κείμενο. Χρησιμοποιείται ο ειδικός χαρακτήρας END για το τέλος του κειμένου. Σε περιπτώσεις όπου υπάρχουν στατιστικές έτοιμες για τις εμφανίσεις των στοιχείων του αλφαβήτου το 1ο βήμα παραλείπεται.
2ο Βήμα: Κατασκευή του Δέντρου του prefix code Huffman tree κατασκευάζεται ως εξής: Δημιουργία ενός δέντρου με ένα κόμβο για κάθε χαρακτήρα a θέτοντας weight(t) = freq(a) και label(t) = a Επανάληψη Αποσπάμε τα δύο δέντρα με το μικρότερο βάρος t1 και t2 Δημιουργούμε ένα καινούργιο δέντρο t3 που έχει αριστερό υπόδεντρο το t1, δεξί το t2 και βάρος weight(t3) = weight(t1) + weight(t2) Επανάληψη μέχρι να μείνει ένα δέντρο Αφού χτιστεί το δέντρο κωδικοποίησης είναι δυνατόν να ανακτηθούν κωδικές λέξεις που συνδέθηκαν με χαρακτήρες με μία απλή αναζήτηση (depth first-search),
3ο Βήμα: Κωδικοποίηση του κειμένου Η κωδικοποίηση γίνεται με τα εξής βήματα: Δημιουργία επικεφαλίδας του συμπιεσμένου αρχείου, που περιέχει το δέντρο κωδικοποίησης και τις κωδικές λέξεις, με τον αλγόριθμο H-ENCODE-TREE (fout, t) Κωδικοποίηση του κειμένου και αποθήκευση στο συμπιεσμένο αρχείο, με τον αλγόριθμο H-ENCODE-TEXT (fin, fout)
Huffman Encoding Η τελική υλοποίηση του αλγόριθμου κωδικοποίησης Huffman είναι: H-ENCODING (fin, fout) H-COUNT (fin) t H-BUILD-TREE H-BUILD-CODE (t, 0) H-ENCODE-TREE (fout, t) H-ENCODE-TEXT (fin, fout) Η κατασκευή του δέντρου έχει κόστος Ο(σ log σ) αν η ταξινόμηση των φύλλων είναι υλοποιημένη αποδοτικά. Η υπόλοιπη διαδικασία έχει γραμμικό χρόνο ανάλογο με το μέγεθος του αρχικού και του συμπιεσμένου κειμένου.
Decoding Η αποκωδικοποίηση κειμένου κωδικοποιημένου με τον αλγόριθμο Huffman γίνεται με τα εξής βήματα: Χτίσιμο του δέντρου κωδικοποίησης, με τον αλγόριθμο H-REBUILD-TREE (fin, t) Ανάκτηση του αρχικού κειμένου, με τον αλγόριθμο H-DECODE-TEXT (fin, fout, root)
Huffman Decoding Η τελική υλοποίηση του αλγόριθμου αποκωδικοποίησης Huffman είναι: H-DECODING (fin, fout) create a new node root H-REBUILD-TREE (fin, root) H-DECODE-TEXT (fin, fout, root )
Dynamic Huffman Coding Αν οι συχνότητες δεν είναι γνωστές από την αρχή πρέπει να διαβαστεί το κείμενο δύο φορές Το δέντρο κωδικοποίησης πρέπει να περιέχεται στο συμπιεσμένο αρχείο.
Κατά τη δυναμική μέθοδο Huffman: Το δέντρο κωδικοποίησης ενημερώνεται κάθε φορά που διαβάζεται ένα σύμβολο από το κείμενο εισόδου Το τρέχων δέντρο είναι ένα Huffman δέντρο σχετικό με το κομμάτι του κειμένου που ήδη έχουμε επεξεργαστεί Η αποδοτικότητα της μεθόδου βασίζεται σε ένα χαρακτηριστικό των δέντρων Huffman, της siblings ιδιότητας
Encoding Η κωδικοποίηση γίνεται ως εξής 1ο Βήμα: αρχικοποίηση δέντρου, με τη συνάρτηση DH-INIT 2ο Βήμα: διάβασμα του αρχείου και για κάθε α Κωδικοποίηση του συμβόλου, με τη συνάρτηση DH-ENCODE-SYMBOL(a, fout) Ενημέρωση του δέντρου με την DH-ADD-NODE(a)
Ο ολοκληρωμένος αλγόριθμος για τη δυναμική κωδικοποίηση είναι: DH-ENCODING (fin, fout) DH-INIT while not end of file fin and a is the next symbol do DH-ENCODE-SYMBOL (a, fout) DH-UPDATE(a) DH-ENCODE-SYMBOL(END, fout)
Decoding Η αποκωδικοποίηση γίνεται ως εξής: 1ο Βήμα: Αρχικοποίηση του δέντρου όπως και στην κωδικοποίηση 2ο Βήμα: Ακολουθείται το κατάλληλο μονοπάτι στο δέντρο ανάλογα με τα bits εισόδου μέχρι την εξαγωγή του χαρακτήρα, μέχρι τον χαρακτήρα END. Η αποκωδικοποίηση του συμβόλου γίνεται με την συνάρτηση DH-DECODE-SYMBOL (fin)
Η ολοκληρωμένη αποκωδικοποίηση Huffman είναι: DH-DECODING (fin, fout) DH-INIT a DH-DECODE-SYMBOL (fin) while a ≠ END do write a in fout DH-UPDATE (a)
Η διαδικασία ενημέρωσης του δέντρου κατά τη διάρκεια των φάσεων κωδικοποίησης και αποκωδικοποίησης γίνεται με τη συνάρτηση DH-UPDATE(a) : Για κάθε σύμβολο α Το βάρος του αντίστοιχου φύλλου n αυξάνεται κατά 1 Σε περίπτωση που δεν ικανοποιείται η ιδιότητα siblings ο κόμβος n ανταλλάσσει θέσεις με τον πλησιέστερο κόμβο m (m<n) στη λίστα έτσι ώστε weight(m) < weight(n). Μετά η ίδια λειτουργία επαναλαμβάνεται στον πατέρα του n έως ότου φτάσουμε στη ρίζα.
Κανονική Κωδικοποίηση Huffman (1) To assign a canonical Huffman to a set of symbols, supposing that symbol i is assigned a code of li bits, maxlength the maximum length and n the number of distinct symbols For i=1 to maxlength do numl[l]=0 For i=1 to n numl[li]=num[li]+1 Number of codes of length l is stored in numl[l] Set firstcode[maxlength]=0 For l=maxlength-1 downto 1 do firstcode[l]=(firstcode[l+1]+num[l+1])/2 Integer for first code of length l is stored in firstcode[l] For l=1 to maxlength nextcode[l]=firstcode[l] For i=1 to n do codeword[i]=nextcode[li] symbol[li, nextcode[li]-firstcode[li]]=i nextcode[li]=nextcode[li]+1 The rightmost li bits of the integer codeword[i] are the code for symbol i.
Κανονική Κωδικοποίηση Huffman (2) To decode a symbol represented in a canonical Huffman Code Set v=nextinputbit() Set l=1 While v<firstcode[l] do (a) set v=2*v+nextinputbit() (b) set l=l+1 Integer v is now a legitimate code of l bits Return symbol[l, v-firstcode[l]] This is the index of the decoded symbol
Arithmetic Coding Βασική ιδέα: Θεωρεί ένα σύμβολο σαν ψηφία ενός αριθμητικού συστήματος και τα κείμενα σαν δεκαδικά μέρη αριθμών μεταξύ του 0 και του 1. Το μήκος του διαστήματος που ανατίθεται σε κάθε ψηφίο (είναι 0.1 για ψηφία στο συνηθισμένο δεκαδικό σύστημα) φτιάχνεται αναλογικά με την συχνότητα εμφάνισης του αντίσοτιχου δεκαδικού αριθμού.
Encoding Το διάστημα που συσχετίζεται με κάθε σύμβολο ai Є Σ (1=<i=<σ) συμβολίζεται σαν Ι(ai ) =[li, hi[. Τα διαστήματα ικανοποιούν τις συνθήκες: l1=0, hσ=1 και li=hi-1 for l<i=<σ. AR-ENCODE (fin) l 0 h1 while not end of file fin and ai is the next symbol do 6. return(l)
Decoding Η αποκωδικοποίηση του αριθμού l γίνεται ως ακολούθως: πρώτα βρίσκουμε τo ai σύμβολο, που να αντιστοιχεί στο διάνυσμα του αριθμού, παράγουμε το ai και ύστερα αντικαθιστούμε το l με l’ που ορίζεται από: Η ίδια διαδικασία επαναλαμβάνεται μέχρι l=0. AR-DECODE (l,fout) while l!=0 do find ai such that write ai in file fout
LZW Coding Χρησιμοποιεί κομμάτια (segments) του αρχικού κειμένου που αποθηκεύονται σε λεξικό που φτιάχνεται κατά τη συμπίεση. Τα κομμάτια του λεξικού που συναντώνται αργότερα αντικαθίστανται από τη θέση τους στο λεξικό. Το λεξικό είναι βασική έννοια της μεθόδου. Είναι κλειστό ως προς τα προθέματα και με κατάλληλη τεχνική hashing η υλοποίησή του είναι αποδοτική. Υλοποιείται με ένα trie.
Encoding Το λεξικό αρχικοποιείται με αλφαριθμητικά μεγέθους 1, τους χαρακτήρες του αλφαβήτου. Έστω a το επόμενο σύμβολο (αμέσως επόμενο από τη δεδομένη εμφάνιση w). Τότε προχωρούμε ως ακολούθως: Αν το wa δεν υπάρχει στο λεξικό, γράφουμε τη θέση του w στο αρχείο εξόδου και προσθέτουμε το wa στο λεξικό. Έπειτα θέτουμε το w σε a και επεξεργαζόμαστε το επόμενο σύμβολο (επόμενο του a). Αν wa υπήρχε στο λεξικό επεξεργαζόμαστε το επόμενο σύμβολο με το κομμάτι wa αντί για w.
Decoding Η μέθοδος απoκωδικοποίησης είναι συμμετρική του αλγορίθμου συμπίεσης. Το λεξικό ανακτάται καθώς η διαδικασία αποσυμπίεσης προχωρά, ως εξής: Διάβασε ένα κωδικό c στο συμπιεσμένο αρχείο, Γράψε στο αρχείο εξόδου το κομμάτι w που έχει θέση c στο λεξικό, Πρόσθεσε τη λέξη wa στο λεξικό όπου a είναι το πρώτο γράμμα του επόμενου κομματιού. - υπάρχει πρόβλημα αν η επόμενη θέση δεν υπάρχει, αυτό μπορεί να συμβεί μόνο αν η επόμενη θέση είναι του wα, κάτι το οποίο σημαίνει ότι το w μπορει να γραφεί ως αz και συνεπώς το αzα προστίθεται στο λεξικό.