इलियास ओमेगा कोडिंग

From alpha
Jump to navigation Jump to search

इलियास ω कोडिंग या इलियास ओमेगा कोडिंग पीटर इलियास द्वारा विकसित घनात्मक पूर्णांक को एन्कोड करने वाला एक सार्वभौमिक कोड (डेटा कम्प्रेशन) है। इलियास गामा कोडिंग और इलियास डेल्टा कोडिंग की तरह, यह एक सार्वभौमिक कोड में इसके परिमाण के क्रम के प्रतिनिधित्व के साथ घनात्मक पूर्णांक को उपसर्ग करके काम करता है। यद्यपि, उन अन्य दो कोडों के विपरीत, इलियास ओमेगा उस उपसर्ग को पुनरावर्ती रूप से एन्कोड करता है; इस प्रकार, उन्हें कभी-कभी पुनरावर्ती इलियास कोड के रूप में जाना जाता है।

ओमेगा कोडिंग का उपयोग उन अनुप्रयोगों में किया जाता है जहां सबसे बड़ा एन्कोडेड मान समय से पहले ज्ञात नहीं होता है, या डेटा कम्प्रेशन डेटा में जहां छोटे मान बड़े मानों की तुलना में अधिक बार होते हैं।

एक धनात्मक पूर्णांक N को एन्कोड करने के लिए:

  1. कोड के अंत में 0 लगाएं.
  2. यदि N=1, stop; एन्कोडिंग पूर्ण है.
  3. कोड की प्रारंभिक में N के बाइनरी अंक प्रणाली प्रतिनिधित्व को जोड़ें। यह कम से कम दो बिट होंगे, जिनमें से पहला बिट 1 है।
  4. मान लीजिए N अभी जोड़े गए बिट्स की संख्या के समान है, शून्य से एक है।
  5. नए N की एन्कोडिंग को जोड़ने के लिए चरण 2 पर लौटें।

इलियास ओमेगा-एन्कोडेड घनात्मक पूर्णांक को डीकोड करने के लिए:

  1. वेरिएबल N से प्रारंभ करें, 1 के मान पर सेट करें।
  2. यदि अगला बिट 0 है तो रुकें। डिकोड किया गया नंबर N है।
  3. यदि अगला बिट 1 है तो इसे प्लस N और बिट्स पढ़ें, और उस बाइनरी नंबर को N के नए मान के रूप में उपयोग करें। चरण 2 पर वापस जाएँ.

उदाहरण

ओमेगा कोड को कई समूहों के रूप में माना जा सकता है। एक समूह या तो एक 0 बिट होता है, जो कोड को समाप्त करता है, या 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 गूगोल, 10 के लिए एन्कोडिंग100, 11 1000 101001100 (लंबाई हेडर के 15 बिट्स) है जिसके बाद 1 गोगोल का 333-बिट बाइनरी प्रतिनिधित्व है, जो 10010 01001001 10101101 00100101 10010100 11000011 01111100 111 है 01011 00001011 00100111 10000100 11000100 11001110 00001011 11110011 10001010 11001110 01000000 10001110 00100001 00011010 01111100 10101010 10110010 01000011 00001000 10101000 00101110 10001111 00010000 00000000 00000000 0000 000000000000 000000000 000000000 000000000 000000000 000000000 000000000 00000000 और एक अनुगामी 0, कुल 349 बिट्स के लिए।

सौवीं घात तक एक गूगोल (1010000) एक 33,220-बिट बाइनरी संख्या है। इसकी ओमेगा एन्कोडिंग 33,243 बिट लंबी है: 11 1111 1000000111000100 (22 बिट्स), इसके बाद मान के 33,220 बिट्स, और अनुगामी 0. इलियास डेल्टा कोडिंग के तहत, वही संख्या 33,250 बिट लंबी है: 000000000000000 10000001110 00100 (31 बिट्स) के बाद मान के 33,219 बिट्स. ओमेगा और डेल्टा कोडिंग, संख्या के सामान्य 33,220-बिट बाइनरी प्रतिनिधित्व की तुलना में क्रमशः 0.07% और 0.09% अधिक लंबी है।

एक घनात्मक पूर्णांक के N एन्कोडिंग के लिए , आवश्यक बिट्स की संख्याB(N), पुनरावर्ती रूप से गणना योग्य है:

उदाहरण कोड

एन्कोडिंग

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();
}

सामान्यीकरण

इलियास ओमेगा कोडिंग शून्य या ऋणात्मक पूर्णांकों को एन्कोड नहीं करती है। सभी गैर-ऋणात्मक पूर्णांकों को एन्कोड करने का एक विधि एन्कोडिंग से पहले 1 जोड़ना और फिर डिकोडिंग के बाद 1 घटाना है, या बिल्कुल समान लेवेनशेटिन कोडिंग का उपयोग करना है। सभी पूर्णांकों को एन्कोड करने का एक विधि यह है एन्कोडिंग से पहले सभी पूर्णांकों (0, 1, -1, 2, -2, 3, -3, ...) को सख्ती से घनात्मक पूर्णांक (1, 2, 3, 4, 5, 6, 7, ...) में मैप करते हुए एक आक्षेप स्थापित किया जाए।

यह भी देखें

संदर्भ

अग्रिम पठन

  • Elias, Peter (March 1975). "Universal codeword sets and representations of the integers". IEEE Transactions on Information Theory. 21 (2): 194–203. doi:10.1109/tit.1975.1055349.
  • Fenwick, Peter (2003). "Universal Codes". In Sayood, Khalid (ed.). Lossless Compression Handbook. New York, NY, USA: Academic Press. pp. 55–78. doi:10.1016/B978-012620861-0/50004-8. ISBN 978-0123907547.

बाहरी संबंध