Elias omega coding
Η κωδικοποίηση Elias ω ή κωδικοποίηση Elias omega είναι ένας καθολικός κώδικας για την κωδικοποίηση θετικών ακεραίων αριθμών που αναπτύχθηκε από τον Peter Elias. Όπως η Elias gamma coding και η Elias delta coding, λειτουργεί προσθέτοντας ένα αντιπροσωπευτικό της τάξης μεγέθους του θετικού ακεραίου σε έναν καθολικό κώδικα. Ωστόσο, σε αντίθεση με τους άλλους δύο κώδικες, ο κώδικας Elias omega κωδικοποιεί το πρόθεμά της με αναδρομικό τρόπο; επομένως, ονομάζονται μερικές φορές αναδρομικοί κώδικες Elias.
Η κωδικοποίηση omega χρησιμοποιείται σε εφαρμογές όπου η μεγαλύτερη κωδικοποιημένη τιμή δεν είναι γνωστή από πριν ή για την συμπίεση δεδομένων στα οποία οι μικρές τιμές είναι πολύ πιο συχνές από τις μεγάλες τιμές.
Για να κωδικοποιήσεις έναν θετικό ακέραιο N:
- Τοποθέτησε ένα "0" στο τέλος του κώδικα.
- Αν N = 1, σταμάτησε; η κωδικοποίηση έχει ολοκληρωθεί.
- Προσθέσε τη δυαδική αντιπροσώπευση του N στην αρχή του κώδικα. Θα είναι τουλάχιστον δύο bits, το πρώτο από τα οποία είναι ένα 1.
- Ορίσε το N ίσο με τον αριθμό των bits που μόλις προστέθηκαν, μείον ένα.
- Επιστρέψε στο Βήμα 2 για να προσθέσεις την κωδικοποίηση του νέου N.
Για να αποκωδικοποιήσεις έναν θετικό ακέραιο που έχει κωδικοποιηθεί με Elias omega:
- Ξεκίνησε με μία μεταβλητή N, που έχει τιμή 1.
- Αν το επόμενο bit είναι "0" τότε σταμάτησε. Η αποκωδικοποιημένη τιμή είναι N.
- Αν το επόμενο bit είναι "1" τότε διάβασε αυτό και άλλα N bits και χρησιμοποίησε τον δυαδικό αυτόν αριθμό ως τη νέα τιμή του N. Επιστρέψε στο Βήμα 2.
Παραδείγματα[επεξεργασία]
Οι κώδικες omega μπορούν να θεωρηθούν ως ένας αριθμός "ομάδων". Μία ομάδα είναι είτε ένα μοναδικό bit "0", που τερματίζει τον κώδικα, είτε δύο ή περισσότερα bits που ξεκινούν με 1, τα οποία ακολουθούνται από μία άλλη ομάδα.
Οι πρώτοι λίγοι κώδικες παρουσιάζονται παρακάτω. Περιλαμβάνονται και οι λεγόμενες υπονοούμενες κατανομές, που περιγράφουν την κατανομή των τιμών για τις οποίες αυτή η κωδικοποίηση παράγει έναν κώδικα μικρότερου μεγέθους; βλέπε Σχέση των καθολικών κώδικων με την πρακτική συμπίεση για περισσότερες πληροφορίες.
Τιμή | Κώδικας | Υπονοούμενη πιθανότητα |
---|---|---|
1 | 0 | 1/2 |
2 | 10 0 | 1/8 |
3 | 11 0 | 1/8 |
4 | 10 100 0 | 1/64 |
5 | 10 101 0 | 1/64 |
6 | 10 110 0 | 1/64 |
7 | 10 111 0 | 1/64 |
8 | 11 1000 0 | 1/128 |
9 | 11 1001 0 | 1/128 |
10 | 11 1010 0 | 1/128 |
11 | 11 1011 0 | 1/128 |
12 | 11 1100 0 | 1/128 |
13 | 11 1101 0 | 1/128 |
14 | 11 1110 0 | 1/128 |
15 | 11 1111 0 | 1/128 |
16 | 10 100 10000 0 | 1/2048 |
17 | 10 100 10001 0 | 1/2048 |
... | ||
100 | 10 110 1100100 0 | 1/8192 |
1000 | 11 1001 1111101000 0 | 1/131,072 |
10,000 | 11 1101 10011100010000 0 | 1/2,097,152 |
100,000 | 10 100 10000 11000011010100000 0 | 1/268,435,456 |
1,000,000 | 10 100 10011 11110100001001000000 0 | 1/2,147,483,648 |
Η κωδικοποίηση για το 1 googol, 10100, είναι 11 1000 101001100 (15 bits μήκους κεφαλίδας) ακολουθούμενο από την 333-bit δυαδική αντιπροσώπευση του 1 googol, που είναι 10010 01001001 10101101 00100101 10010100 11000011 01111100 11101011 00001011 00100111 10000100 11000100 11001110 00001011 11110011 10001010 11001110 01000000 10001110 00100001 00011010 01111100 10101010 10110010 01000011 00001000 10101000 00101110 10001111 00010000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 και ένα τελικό 0, για συνολικά 349 bits.
Ένα googol στην εκατοστή δύναμη (1010000) είναι ένας δυαδικός αριθμός 33,220 bits. Η κωδικοποίηση του omega είναι 33,243 bits μήκους: 11 1111 1000000111000100 (22 bits), ακολουθούμενα από 33,220 bits της τιμής και ένα τελικό 0. Κάτω από Elias delta coding, ο ίδιος αριθμός είναι 33,250 bits μήκους: 000000000000000 1000000111000100 (31 bits) ακολουθούμενα από 33,219 bits της τιμής. Οι κωδικοποιήσεις omega και delta είναι, αντίστοιχα, 0.07% και 0.09% μεγαλύτερες από την κανονική δυαδική αναπαράσταση 33,220 bits του αριθμού.
Μήκος κώδικα[επεξεργασία]
Για την κωδικοποίηση ενός θετικού ακεραίου N, ο αριθμός των απαιτούμενων bits, B(N), είναι αναδρομικός:
Επειδή ο επαναληπτικός λογάριθμος αυξάνεται αργότερα από όλα για οποιοδήποτε σταθερό , η ασυμπτωτική ρυθμίση αυξήσεως είναι , όπου το άθροισμα τερματίζεται όταν πέφτει κάτω από το ένα.
Ασυμπτωτική ολοκλήρωση[επεξεργασία]
Η κωδικοποίηση Elias omega είναι ένας ασυμπτωτικά ολοκληρωμένος πρόθετος κώδικας.[1]
Σχεδίαση απόδειξης. Ένας πρόθετος κώδικας πρέπει να ικανοποιεί την ισότητα Kraft. Για την κωδικοποίηση Elias omega, η ισότητα Kraft λέει
Παράδειγμα κώδικα[επεξεργασία]
Κωδικοποίηση[επεξεργασία]
void eliasOmegaEncode(char* source, char* dest)
{
IntReader intreader(source);
BitWriter bitwriter(dest);
while (intreader.hasLeft())
{
int num = intreader.getInt();
BitStack bits;
while (num > 1) {
int len = 0;
for (int temp = num; temp > 0; temp >>= 1) // calculate 1+floor(log2(num))
len++;
for (int i = 0; i < len; i++)
bits.pushBit((num >> i) & 1);
num = len - 1;
}
while (bits.length() > 0)
bitwriter.putBit(bits.popBit());
bitwriter.putBit(false); // write one zero
}
bitwriter.close();
intreader.close();
}
Αποκωδικοποίηση[επεξεργασία]
void eliasOmegaDecode(char* source, char* dest) {
BitReader bitreader(source);
IntWriter intwriter(dest);
while (bitreader.hasLeft())
{
int num = 1;
while (bitreader.inputBit()) // potentially dangerous with malformed files.
{
int len = num;
num = 1;
for (int i = 0; i < len; ++i)
{
num <<= 1;
if (bitreader.inputBit())
num |= 1;
}
}
intwriter.putInt(num); // write out the value
}
bitreader.close();
intwriter.close();
}
Γενικεύσεις[επεξεργασία]
Η κωδικοποίηση Elias omega δεν κωδικοποιεί το μηδέν ή αρνητικούς ακεραίους. Ένας τρόπος για να κωδικοποιήσεις όλους τους μη αρνητικούς ακεραίους είναι να προσθέσεις 1 πριν από την κωδικοποίηση και μετά να αφαιρέσεις 1 μετά την αποκωδικοποίηση, ή να χρησιμοποιήσεις τη πολύ παρόμοια Levenshtein coding. Ένας τρόπος για να κωδικοποιήσεις όλους τους ακεραίους είναι να δημιουργήσεις μία bijection, αντιστοιχίζοντας όλους τους ακεραίους (0, 1, -1, 2, -2, 3, -3, ...) σε αυστηρά θετικούς ακεραίους (1, 2, 3, 4, 5, 6, 7, ...) πριν από την κωδικοποίηση.
Δείτε επίσης[επεξεργασία]
Βιβλιογραφία[επεξεργασία]
- ↑ Elias, P. (March 1975). «Universal codeword sets and representations of the integers» (στα αγγλικά). IEEE Transactions on Information Theory 21 (2): 194–203. doi: . ISSN 0018-9448. https://ieeexplore.ieee.org/document/1055349/.
Περαιτέρω ανάγνωση[επεξεργασία]
- «Universal codeword sets and representations of the integers». IEEE Transactions on Information Theory 21 (2): 194–203. March 1975. doi: .
- Sayood, Khalid, επιμ. (2003). «Lossless Compression Handbook». Lossless Compression Handbook. New York, NY, USA: Academic Press, σσ. 55–78. doi: . ISBN 978-0123907547.