क्या अंकगणित कोडिंग के लिए हफमैन कोडिंग का सामान्यीकरण है?


11

हफ़मैन कोडिंग, अंकगणित कोडिंग और रेंज कोडिंग के बीच संबंधों को समझने की कोशिश में, मैंने हफ़मैन कोडिंग की कमियों को भिन्नात्मक बिट-पैकिंग की समस्या से संबंधित माना ।

यह है, मान लें कि आपके पास एक प्रतीक के लिए 240 संभावित मान हैं, और इसे बिट्स में एन्कोड करने की आवश्यकता है, आप प्रति प्रतीक 8 बिट्स के साथ फंस जाएंगे, भले ही आपको "पूर्ण" 8 की आवश्यकता न हो, क्योंकि 8 256 संभावित मूल्यों को व्यक्त कर सकता है। प्रति प्रतीक। इस समस्या का एक हल कुछ ऐसा है जिसे मैंने "आंशिक बिट पैकिंग" के रूप में संदर्भित किया है, जहां आप गुणन का उपयोग करके दो की गैर-शक्ति द्वारा "बिटशिफ्ट" कर सकते हैं। बस शक्तियों के-दो की गुणन की तरह जा रहे हैं x * 2 == x << 1और x * 4 == x << 2दो की सभी शक्तियों के लिए और इतने पर है, तो भी आप एक गैर बिजली के- 2 बजाय गुणा करके के साथ "बदलाव", और आंशिक बिट आकार प्रतीकों में पैक कर सकते हैं ।

हफ़मैन कोडिंग के साथ समस्या समान है: आप उन कोड के साथ समाप्त होते हैं जो लंबाई में गैर-फ्रैक्चर-बिट-आकार के होने चाहिए, और इसलिए इसमें यह पैकिंग अक्षमता है। हालाँकि, आप केवल फ़्राकिस्टोनल-बिट-पैकिंग के समाधान का उपयोग नहीं कर सकते, क्योंकि यह समाधान निश्चित आकार के प्रतीकों को मानता है।

सवाल यह है कि क्या अंकगणित या बिट-पैकिंग के समान एक समान विचार के साथ अंकगणित पर अंकुश लगाने के लिए कोई प्रश्न- पत्र या समाधान बेहतर हैं? (या इसके विपरीत कोई परिणाम)।


1
अंकगणित कोडिंग पहले से ही इष्टतम है। इसमें सुधार करने की जरूरत नहीं है।
युवल फिल्मस Yu

@YuvalFilmus हाँ मेरा मतलब था, अंकगणित कोडिंग के साथ इसे बराबर लाने के लिए हफ़मैन कोडिंग पर कैसे सुधार किया जाए।
Realz Slaw

1
एक सुझाव के रूप में, आप अंकगणित कोडिंग की तुलना में असममित न्यूमेरिक सिस्टम (ANS) कोडिंग को आसानी से समझ सकते हैं। विशेष रूप से, उस विशेष सूत्रीकरण को "आंशिक बिट पैकिंग" के रूप में देखना थोड़ा आसान है।
छद्म नाम

@Pseudonym मुझे यह पृष्ठ मिला जो कि RANS और हफ़मैन कोडिंग के बीच यह संबंध बनाता प्रतीत होता है। नहीं कह सकता मैं इसे अभी तक समझता हूं, लेकिन मुझे लगता है कि यह पर्याप्त है। यदि आप टिप्पणी को उत्तर देते हैं तो मैं स्वीकार करूंगा।
Realz Slaw

@YuvalFilmus मुझे आशा है कि मैंने मामला बना दिया है कि अंकगणित कोडिंग में सुधार की आवश्यकता थी, और ANS एक सुधार है।
छद्म नाम

जवाबों:


13

आइए, हफमैन कोडिंग के बारे में थोड़ा अलग तरीके से विचार करें।

मान लीजिए कि आपके पास संभाव्यता 0.5, 0.25 और 0.25 के साथ तीन प्रतीकों, A, B, और C की वर्णमाला है। क्योंकि प्रायिकताएँ दो के व्युत्क्रम शक्तियाँ होती हैं, इसमें एक हफ़मैन कोड होता है जो कि इष्टतम होता है (यानी यह अंकगणित कोडिंग के समान है)। हम इस उदाहरण के लिए विहित कोड 0, 10, 11 का उपयोग करेंगे।

मान लीजिए हमारा राज्य एक बड़ा पूर्णांक है, जिसे हम कहेंगे । आप एक फ़ंक्शन के रूप में एन्कोडिंग के बारे में सोच सकते हैं जो वर्तमान स्थिति और एनकोड करने के लिए एक प्रतीक लेता है, और नए राज्य को लौटाता है:s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=4s+3

तो चलिए राज्य 11 (जो कि बाइनरी में 1011 है) से शुरू करते हैं, प्रतीक बी को एनकोड करते हैं। नया राज्य 46 है, जो बाइनरी में 101110 है। जैसा कि आप देख सकते हैं, यह "पुरानी" स्थिति है जिसमें अनुक्रम 10 को अंत तक जोड़ा गया है। हमारे पास अनिवार्य रूप से "आउटपुट" बिट अनुक्रम 10 है।

अब तक सब ठीक है।

[04,24)[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)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=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)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

प्रतीक A को एनकोड करने के लिए, हम और , और फिर ।मैं=रोंआधुनिक3एनकोड(रों',एकमैं)s=s3i=smod3encode(s,Ai)

यह अंकगणित कोडिंग के बराबर है। यह वास्तव में असममित न्यूमेरिकल सिस्टम के रूप में ज्ञात विधियों का एक परिवार है , और जेरेक डूडा द्वारा पिछले कुछ वर्षों में विकसित किया गया था। नाम का अर्थ स्पष्ट होना चाहिए: संभावना साथ एक प्रतीक को एनकोड करने के लिए , आप वैचारिक रूप से राज्य से आधार-पी अंक चोरी करते हैं, और फिर आधार-क्यू अंक जोड़ते हैं। विषमता राज्य को दो अलग-अलग आधारों में एक अंक के रूप में व्याख्या करने से आती है।pq

कारण यह है कि कोडिंग विधियों का एक परिवार यह है कि जो हमने यहां देखा है, वह स्वयं अव्यवहारिक है; इस तथ्य से निपटने के लिए कुछ संशोधनों की आवश्यकता है कि राज्य चर को कुशलता से हेरफेर करने के लिए आपके पास शायद अनंत-सटीक पूर्णांक नहीं हैं, और ऐसे कई तरीके हैं जिनसे आप इसे प्राप्त कर सकते हैं। अंकगणित कोडिंग, ज़ाहिर है, अपने राज्य के लिए सटीक के साथ एक समान मुद्दा है।

व्यावहारिक वेरिएंट में rANS ("r" का अर्थ "अनुपात") और tANS ("टेबल-चालित") शामिल हैं।

ANS के पास अंकगणितीय कोडिंग पर कुछ दिलचस्प फायदे हैं, व्यावहारिक और सैद्धांतिक दोनों:

  • अंकगणित कोडिंग के विपरीत, "राज्य" शब्दों की एक जोड़ी के बजाय एक एकल शब्द है।
  • इतना ही नहीं, लेकिन एक एएनएस एनकोडर और इसके संबंधित डिकोडर में समान राज्य हैं और उनके संचालन पूरी तरह से सममित हैं। यह कुछ दिलचस्प संभावनाओं को बढ़ाता है, जैसे कि आप एन्कोडेड प्रतीकों की विभिन्न धाराओं को इंटरलेव कर सकते हैं और सब कुछ पूरी तरह से सिंक्रनाइज़ हो जाता है।
  • व्यावहारिक कार्यान्वयन की जरूरत है, निश्चित रूप से, "आउटपुट" जानकारी के लिए जैसा कि आप जाते हैं, और अंत में लिखे जाने के लिए इसे केवल एक बड़े पूर्णांक में इकट्ठा न करें। हालांकि, "आउटपुट" के आकार को कम से कम संपीड़न (आमतौर पर मामूली) के बदले में कॉन्फ़िगर किया जा सकता है। तो जहाँ अंकगणित कोडर एक समय में थोड़ा उत्पादन करना चाहिए, ANS एक बार में एक बाइट या एक नायब का उत्पादन कर सकता है। यह आपको गति और संपीड़न के बीच एक सीधा व्यापार प्रदान करता है।
  • यह बाइनरी अंकगणितीय कोडिंग के रूप में वर्तमान-पीढ़ी के हार्डवेयर के बारे में तेज़ प्रतीत होता है, और इसलिए हफ़मैन कोडिंग के साथ प्रतिस्पर्धी है। यह बड़े-वर्णमाला अंकगणित कोडिंग और इसके वेरिएंट (जैसे रेंज कोडिंग) की तुलना में बहुत तेज बनाता है।
  • यह पेटेंट-मुक्त प्रतीत होता है।

मुझे नहीं लगता कि मैं कभी अंकगणित कोडिंग करने जा रहा हूं।


4
अब यह ANS एन्कोडिंग पर सबसे स्पष्ट स्पष्टीकरण है जो मैंने कभी देखा है।
माइकल डियरडफ

2

एक सरल उदाहरण के रूप में, यदि आपके पास प्रायिकता 1 / 3rd प्रत्येक के साथ तीन प्रतीक हैं, तो आपका इष्टतम हफ़मैन एन्कोडिंग 5/3 बिट्स के औसत के साथ तीन प्रतीकों 0, 10 और 11 का उपयोग करेगा।

मूल प्रतीकों में से 5 को समाप्‍त करके 243 प्रतीक बनाए गए हैं, जिनमें से प्रायिकता 1/243 है। जो कि 1/256 के ज्यादा करीब है। इष्टतम हफ़मैन एन्कोडिंग इन समूहों में से 13 को 7 बिट्स में और 230 समूहों को 8 बिट्स में, प्रति समूह 7.9465 बिट्स की औसत या 1.5893 बिट्स प्रति मूल प्रतीक के लिए, मूल हफ़मैन कोडिंग के लिए 1.6667 बिट्स से नीचे, अंकगणितीय कोडिंग के साथ 1.5850 तक ले जाएगा। बिट्स।

तो सिद्धांत रूप में आप दो प्रतीकों को एक बड़े प्रतीक में, या तीन प्रतीकों में से प्रत्येक को एक बड़े प्रतीक में जोड़ सकते हैं, और संयोजन के लिए हफमैन कोडिंग का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.