आइए, हफमैन कोडिंग के बारे में थोड़ा अलग तरीके से विचार करें।
मान लीजिए कि आपके पास संभाव्यता 0.5, 0.25 और 0.25 के साथ तीन प्रतीकों, A, B, और C की वर्णमाला है। क्योंकि प्रायिकताएँ दो के व्युत्क्रम शक्तियाँ होती हैं, इसमें एक हफ़मैन कोड होता है जो कि इष्टतम होता है (यानी यह अंकगणित कोडिंग के समान है)। हम इस उदाहरण के लिए विहित कोड 0, 10, 11 का उपयोग करेंगे।
मान लीजिए हमारा राज्य एक बड़ा पूर्णांक है, जिसे हम कहेंगे । आप एक फ़ंक्शन के रूप में एन्कोडिंग के बारे में सोच सकते हैं जो वर्तमान स्थिति और एनकोड करने के लिए एक प्रतीक लेता है, और नए राज्य को लौटाता है:s
एनकोड ( s , A )एनकोड (s,B)एनकोड (s,C)= 2 एस= 4 एस + 2= 4 एस + 3
तो चलिए राज्य 11 (जो कि बाइनरी में 1011 है) से शुरू करते हैं, प्रतीक बी को एनकोड करते हैं। नया राज्य 46 है, जो बाइनरी में 101110 है। जैसा कि आप देख सकते हैं, यह "पुरानी" स्थिति है जिसमें अनुक्रम 10 को अंत तक जोड़ा गया है। हमारे पास अनिवार्य रूप से "आउटपुट" बिट अनुक्रम 10 है।
अब तक सब ठीक है।
[ ०4, २4)[24,34)[34,44)
मूल रूप से हम यहां जो कुछ भी कर रहे हैं वह सब कुछ सामान्य हर से गुणा कर रहा है। कल्पना कीजिए कि राज्य वास्तव में आधार 4 था। प्रतीक B को एनकोड करना वास्तव में उस आधार में अंक 2 को आउटपुट कर रहा है, और प्रतीक C को एन्कोडिंग उस आधार में अंक 3 को आउटपुट कर रहा है।
हालाँकि, प्रतीक A थोड़ा अलग है, क्योंकि यह आधार 4 में संपूर्ण अंक नहीं है।
इसके बजाय, हम वर्णमाला को समान संभावना वाले प्रतीकों A_0, A_1, B, C के सेट के रूप में सोच सकते हैं। यह, फिर से, एक इष्टतम हफ़मैन कोड 00, 01, 10, 11. या फिर है, हम इसे आधार 4 में सोच सकते हैं। एक प्रतीक को एनकोड करने के लिए, हम बस करते हैं:
encode(s,A0)encode(s,A1)encode(s,B)encode(s,C)=4s+0=4s+1=4s+2=4s+3
A0A1
s
s′=⌊s2⌋
i=smod2
और फिर ।encode(s′,Ai)
हमारे पिछले उदाहरण का उपयोग करते हुए, , हम पाते हैं कि और , और फिर । नया राज्य बाइनरी में 10101 है।s=11मैं = 1 एनकोड ( 5 , ए 1 ) = 4 × 5 + 1 = 21s′=5i=1encode(5,A1)=4×5+1=21
अब यह हफ़मैन कोडिंग के समान उत्पादन नहीं करता है, लेकिन यह एक आउटपुट उत्पन्न करता है जिसकी लंबाई समान होती है। और मुझे आशा है कि आप देख सकते हैं कि यह विशिष्ट रूप से डिकोडेबल भी है। एक प्रतीक को डिकोड करने के लिए, हम शेष को 4 से विभाजित करते हैं। यदि मान 2 या 3 है, तो प्रतीक क्रमशः B या C है। यदि यह 0 या 1 है, तो प्रतीक A है, और फिर हम राज्य को 2 से गुणा करके और 0 या 1 जोड़कर थोड़ी जानकारी वापस रख सकते हैं।
इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह स्वाभाविक रूप से आंशिक-बिट एन्कोडिंग तक फैली हुई है, जब संभावनाओं के अंश और / या भाजक दो की शक्तियां नहीं हैं। मान लीजिए कि हमारे पास दो प्रतीक हैं, A और B, जहां A की संभावना और B की संभावना । तब हम एक प्रतीक को इनकोड कर सकते हैं: २3525
encode(s,A0)encode(s,A1)encode(s,A2)encode(s,B0)encode(s,B1)=5s+0=5s+1=5s+2=5s+3=5s+4
प्रतीक A को एनकोड करने के लिए, हम और , और फिर ।मैं=रोंआधुनिक3एनकोड(रों',एकमैं)s′=⌊s3⌋i=smod3encode(s′,Ai)
यह अंकगणित कोडिंग के बराबर है। यह वास्तव में असममित न्यूमेरिकल सिस्टम के रूप में ज्ञात विधियों का एक परिवार है , और जेरेक डूडा द्वारा पिछले कुछ वर्षों में विकसित किया गया था। नाम का अर्थ स्पष्ट होना चाहिए: संभावना साथ एक प्रतीक को एनकोड करने के लिए , आप वैचारिक रूप से राज्य से आधार-पी अंक चोरी करते हैं, और फिर आधार-क्यू अंक जोड़ते हैं। विषमता राज्य को दो अलग-अलग आधारों में एक अंक के रूप में व्याख्या करने से आती है।pq
कारण यह है कि कोडिंग विधियों का एक परिवार यह है कि जो हमने यहां देखा है, वह स्वयं अव्यवहारिक है; इस तथ्य से निपटने के लिए कुछ संशोधनों की आवश्यकता है कि राज्य चर को कुशलता से हेरफेर करने के लिए आपके पास शायद अनंत-सटीक पूर्णांक नहीं हैं, और ऐसे कई तरीके हैं जिनसे आप इसे प्राप्त कर सकते हैं। अंकगणित कोडिंग, ज़ाहिर है, अपने राज्य के लिए सटीक के साथ एक समान मुद्दा है।
व्यावहारिक वेरिएंट में rANS ("r" का अर्थ "अनुपात") और tANS ("टेबल-चालित") शामिल हैं।
ANS के पास अंकगणितीय कोडिंग पर कुछ दिलचस्प फायदे हैं, व्यावहारिक और सैद्धांतिक दोनों:
- अंकगणित कोडिंग के विपरीत, "राज्य" शब्दों की एक जोड़ी के बजाय एक एकल शब्द है।
- इतना ही नहीं, लेकिन एक एएनएस एनकोडर और इसके संबंधित डिकोडर में समान राज्य हैं और उनके संचालन पूरी तरह से सममित हैं। यह कुछ दिलचस्प संभावनाओं को बढ़ाता है, जैसे कि आप एन्कोडेड प्रतीकों की विभिन्न धाराओं को इंटरलेव कर सकते हैं और सब कुछ पूरी तरह से सिंक्रनाइज़ हो जाता है।
- व्यावहारिक कार्यान्वयन की जरूरत है, निश्चित रूप से, "आउटपुट" जानकारी के लिए जैसा कि आप जाते हैं, और अंत में लिखे जाने के लिए इसे केवल एक बड़े पूर्णांक में इकट्ठा न करें। हालांकि, "आउटपुट" के आकार को कम से कम संपीड़न (आमतौर पर मामूली) के बदले में कॉन्फ़िगर किया जा सकता है। तो जहाँ अंकगणित कोडर एक समय में थोड़ा उत्पादन करना चाहिए, ANS एक बार में एक बाइट या एक नायब का उत्पादन कर सकता है। यह आपको गति और संपीड़न के बीच एक सीधा व्यापार प्रदान करता है।
- यह बाइनरी अंकगणितीय कोडिंग के रूप में वर्तमान-पीढ़ी के हार्डवेयर के बारे में तेज़ प्रतीत होता है, और इसलिए हफ़मैन कोडिंग के साथ प्रतिस्पर्धी है। यह बड़े-वर्णमाला अंकगणित कोडिंग और इसके वेरिएंट (जैसे रेंज कोडिंग) की तुलना में बहुत तेज बनाता है।
- यह पेटेंट-मुक्त प्रतीत होता है।
मुझे नहीं लगता कि मैं कभी अंकगणित कोडिंग करने जा रहा हूं।