हफ़मैन एन्कोडिंग: विभाजक की कोई आवश्यकता क्यों नहीं है?


17
Char        Code
====        ====
E           0000
i           0001
y           0010
l           0011
k           0100
.           0101
space       011
e           10
r           1100
s           1101
n           1110
a           1111

मूल लेख:

झील के पास देखी गई भयानक आँखें

एन्कोडेड:
000010110000011001110001010110110111110101111111100100111111110101100100

हफ़मैन एन्कोडिंग में विभाजक की आवश्यकता क्यों नहीं है?


1
क्योंकि जब आप एक द्विआधारी मूल्य को डिकोड करते हैं, तो आप बिट्स के "बाएं से दाएं" को लेते हैं जो मूल पाठ से पहले मूल्य से मेल खाता है। जैसे इस मामले में, आप सबसे बाईं ओर का हिस्सा (0000) मैच ई देखते हैं। यदि आपके चार कोड में 000 के मान के साथ कोई प्रतीक था, तो आप 000 को उस प्रतीक से बदल देंगे, और फिर शेष बिट्स से फिर से खोजना शुरू करेंगे। एक "बाएं से दाएं" तरीके से। इसलिए आपको किसी अलगाव की आवश्यकता नहीं है।
सैयद अली हमजा

1
सवाल यह है कि आमतौर पर विभाजकों की आवश्यकता होती है। आप पहले से ही जानते हैं कि आपको Eerie eyes seen near lake(अंतरिक्ष वर्ण को छोड़कर) अच्छी तरह से विभाजक की आवश्यकता नहीं है । लेकिन पात्रों को स्वयं विभाजकों की आवश्यकता नहीं है। ऐसा क्यों नहीं है?
MSalters

इसे स्वयं डिकोड करने का प्रयास करें, कभी कोई अस्पष्टता नहीं है।
njzk2

@MSalters: लेकिन विभाजक कर रहे हैं आमतौर पर चर लंबाई शब्दों के साथ की जरूरत: cat cheat for micecatch eat form ice। आपकी उपमा त्रुटिपूर्ण है: प्रत्येक अक्षर परमाणु है; अक्षर तुच्छ रूप से प्रतिष्ठित और आंतरिक रूप से अलग होते हैं। एक बेहतर सादृश्य यह होगा कि "आप शापित (हस्तलिखित) स्क्रिप्ट क्यों पढ़ सकते हैं, जब प्रत्येक शब्द सिर्फ एक लंबी, स्क्वीगिंग, सेल्फ-इंटरसेक्टिंग लाइन है?", और यहां तक ​​कि एक गरीब सादृश्य है, क्योंकि आप हस्तलिखित शब्द देख सकते हैं ( या यहां तक ​​कि एक का एक हिस्सा) और अलग-अलग अक्षरों को समझें - जबकि हफमैन-एन्कोडेड स्ट्रिंग जिबरिश है अगर आप शुरुआत नहीं देख सकते हैं।
जी-मैन का कहना है कि 'मोनिका' की बहाली

@MSalters मुझे yout बिंदु दिखाई नहीं देता है। मुझे पात्रों के लिए विभाजकों की आवश्यकता नहीं है क्योंकि हम एक निश्चित-चौड़ाई वाले एन्कोडिंग का उपयोग कर रहे हैं: आठ बिट्स के प्रत्येक क्रमिक ब्लॉक एक वर्ण से मेल खाते हैं। लेकिन हफ़मैन कोडिंग निश्चित-चौड़ाई नहीं है, इसलिए प्रश्न।
डेविड रिचरबी

जवाबों:


50

आपको एक विभाजक की आवश्यकता नहीं है क्योंकि हफ़मैन कोड प्रीफ़िक्स-फ्री कोड (भी, अनहेल्दी, "प्रीफ़िक्स कोड") के रूप में जाना जाता है। इसका अर्थ है कि कोई भी कोडवर्ड किसी अन्य कोडवर्ड का एक उपसर्ग नहीं है। उदाहरण के लिए, आपके उदाहरण में "ई" के लिए कोडवर्ड 10 है, और आप देख सकते हैं कि कोई अन्य कोडवर्ड 10 अंकों के साथ शुरू नहीं होता है।

इसका मतलब यह है कि आप कोड को एक कोडवर्ड के रूप में देखने के बाद बाएं से दाएं एन्कोडेड स्ट्रिंग को पढ़कर और एक चरित्र को आउटपुट करके लालच को डिकोड कर सकते हैं। उदाहरण के लिए, 0, 00 और 000 कुछ भी कोड नहीं करते हैं ताकि आप बिट्स पढ़ते रहें। जब आप 0000 पढ़ते हैं, तो यह "E" को एन्कोड करता है और क्योंकि कोड उपसर्ग-मुक्त है, आप जानते हैं कि कोई अन्य कोडवर्ड 0000x नहीं है, इसलिए अब आप "E" को आउटपुट कर सकते हैं और अगले कोडवर्ड को पढ़ना शुरू कर सकते हैं। फिर, 1 कुछ भी सांकेतिक शब्दों में बदलना नहीं करता है, लेकिन 10 "ई" सांकेतिक शब्दों में बदलना है। कोई अन्य कोडवर्ड "10" से शुरू नहीं होता है, इसलिए आप "ई" का उत्पादन कर सकते हैं। और इसी तरह।


1
उपसर्ग कोड को आमतौर पर तात्कालिक कोड के रूप में भी जाना जाता है (उदाहरण के लिए, कवर एंड थॉमस द्वारा सूचना सिद्धांत के तत्व)। मुझे लगता है कि प्रीफिक्स कोड शब्द प्रीफिक्स-फ्री कोड की तुलना में अधिक बार आता है।
बैटमैन

3
यह भी ध्यान देने योग्य है कि समवर्ती हफ़मैन कोड के अनुक्रम को डिकोड करने के लिए, किसी को शुरू करने के लिए सही कोडवर्ड सीमा दी जानी चाहिए। यदि कोई गलत कोडवर्ड सीमा पर अनुक्रम को डिकोड करने की कोशिश करता है, तो डिकोडिंग प्रक्रिया आउटपुट प्रतीकों का गलत अनुक्रम उत्पन्न करेगी।
रवांग

@rwong: यदि हफ़मैन कोड गलत तरीके से सिंक्रनाइज़ किया गया है, तो यह गलत प्रतीकों को अनिश्चित काल तक आउटपुट करना जारी रख सकता है, लेकिन किसी भी समय यह गलत तरीके से एक प्रतीक की लंबाई निर्धारित करता है कि संभव गलत राज्यों की संख्या कम हो जाएगी।
19

@supercat मुझे लगता है कि मैं इसे एक अलग तरीके से उद्धृत करूंगा: यदि कोई हफ़मैन डिकोडर शुरू में एक गलत कोडवर्ड सीमा पर सेट होता है और प्रसंस्करण शुरू करता है, तो एक संभावना है (जो शून्य या कुछ भी हो सकती है, और शब्दकोश और शब्दकोश दोनों पर निर्भर हो सकती है) बिट स्ट्रीम सामग्री) कि यह सही समय पर संयोग से एक सही कोडवर्ड सीमा पर उतर सकता है, और जब ऐसा होता है तो यह बाद के प्रतीकों के लिए सही डिकोडिंग परिणाम उत्पन्न करेगा। गुणों (कोडवर्ड शब्दकोश में, और बिट स्ट्रीम पर) में कुछ शोध हुए हैं जो इस पुन: सिंक्रनाइज़ेशन की गारंटी देंगे।
रवांग

@rwong: यदि मूल डेटा एक वितरण के साथ यादृच्छिक था जैसे कि धारा के बिट्स में से प्रत्येक में एक या शून्य होने की एक स्वतंत्र संभावना होगी, तो एन प्रतीकों से अधिक के लिए सिंक से बाहर शेष रहने की संभावना बढ़ रही एन के साथ तेजी से क्षय होगा। वास्तविक डेटा में ऐसे पैटर्न शामिल होने की संभावना है जो कि पुनरुत्थान को रोक सकते हैं, लेकिन व्यवहार में यह संभावना नहीं है कि 100MB पाठ फ़ाइल की शुरुआत में त्रुटि सभी 100MB पाठ को दूषित करेगी।
सुपरकैट

13

इसे पेड़ के रूप में कल्पना करना मददगार है। आप बस पेड़ को पीछे छोड़ रहे हैं जब तक कि आप एक पत्ती के नोड को नहीं मारते, और फिर जड़ से पुनः शुरू करते हैं। एल्गोरिथ्म से जो हफ़मैन कोडिंग करता है, आप देख सकते हैं कि इस तरह की संरचना प्रक्रिया में बनाई गई है।

https://en.wikipedia.org/wiki/File:HuffmanCodeAlg.png


6
यहां महत्वपूर्ण पहलू यह है कि सभी मान्य कोड शब्द लीफ़ हैं। यदि आपको आंतरिक नोड्स पर भी प्रतीक थे, तो आपको विभाजकों की आवश्यकता होगी।
MvG

3

E के अलावा कोई भी कोड 0000 से शुरू नहीं होता है। I के अलावा कोई भी कोड 0001 से शुरू नहीं होता है। एक चरम मामले के रूप में, ई के अलावा कोई भी कोड 01 से शुरू नहीं होता है। आपके पास ई = 0000, स्पेस = 000 जैसी चीजें नहीं हैं, जहां आपको पता नहीं होगा कि आपको तीन शून्य मिलते हैं तो क्या करें।

अपने एन्कोडेड स्ट्रिंग को देखें: 0000101100000 ...

आपने पहला शून्य पढ़ा। आपको पता है कि कोड ई, i, y, l, k, अल्पविराम या अंतरिक्ष में से एक है। अगले शून्य का अर्थ है कि यह k, अल्पविराम या स्थान नहीं है, लेकिन E, i, y या l है। अगले शून्य का मतलब है कि यह ई या मैं है। अगले शून्य का मतलब है कि यह एक ई है। जब आप जानते हैं कि यह कौन सा कोड है, तो आप जानते हैं कि आपने उस कोड के लिए सभी बिट्स को पार्स किया है।

फिर आपके पास 101100000 है ... 1 का मतलब है कि आपके पास ई, आर, एस, एन या ए है। अगला बिट 0 है, इसलिए कोड ई है। फिर, आप उस चरित्र के साथ कर रहे हैं।


-2

हम हफ़मैन एन्कोडिंग में विभाजक का उपयोग नहीं कर सकते हैं क्योंकि प्रत्येक अक्षर का बाइनरी समकक्ष किसी भी अक्षर के उपसर्ग कोड से मेल नहीं खाता है, इसलिए हम विभाजक का उपयोग किए बिना भी कर सकते हैं।


3
क्या मैंने पहले से ही ऐसा नहीं कहा है, केवल कई नेस्टेड नकारात्मक के भ्रमित स्तरों के बिना। (और, वैसे, ऐसा नहीं है कि हम एक विभाजक का उपयोग नहीं कर सकते ; बस हमें इसकी आवश्यकता नहीं है।)
डेविड रिचरबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.