वरना वह आवेश करेगा और अपना घर फूंक देगा!
वह पूरी तरह अप्रासंगिक था। यह चुनौती वास्तव में हफमैन कोडिंग के बारे में है । इसका सार यह है कि किसी दिए गए पाठ में वर्णों की आवृत्ति का उपयोग उसके प्रतिनिधित्व को कम करने के लिए किया जाता है। दूसरे शब्दों में, मान लें कि हमारी वर्णमाला अंतरिक्ष और अंतरिक्ष के a
माध्यम से z
है। वह 27 अक्षर का है। उनमें से प्रत्येक को केवल 5 बिट्स में विशिष्ट रूप से एन्कोड किया जा सकता है क्योंकि 5 बिट्स में 32 अक्षरों के लिए पर्याप्त जगह है। हालाँकि, कई स्थितियों में (जैसे सामान्य रूप से अंग्रेजी, या भाषाएं), कुछ पात्र दूसरों की तुलना में अधिक होते हैं। हम अधिक लगातार पात्रों के लिए कम बिट्स का उपयोग कर सकते हैं और (शायद) कम लगातार पात्रों के लिए अधिक बिट्स का। सही किया, बिट्स की संख्या में समग्र बचत है और मूल पाठ अभी भी विशिष्ट रूप से खंगाला जा सकता है।
आइए एक उदाहरण के रूप में "यह प्रश्न हफ़मैन कोडिंग के बारे में है"। यह पाठ 37 वर्ण लंबा है, जो सामान्य रूप से 37 * 8 = 296 बिट्स होगा, हालांकि यदि हम प्रत्येक वर्ण के लिए केवल 5 बिट्स का उपयोग करते हैं तो केवल 37 * 5 = 185 बिट्स । यह याद रखना।
पाठ में प्रत्येक वर्ण और उनकी आवृत्तियों की तालिका (सॉर्टा) है, जो कम से कम बार (जहां _ एक स्थान के लिए खड़ा है) से क्रमबद्ध है:
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
एक संबद्ध इष्टतम कोडिंग हो सकती है:
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
यह तुरंत स्पष्ट होना चाहिए कि यह हर चरित्र के लिए केवल 5 बिट्स का उपयोग करने से बेहतर एन्कोडिंग होगा। आइए जानें कि कितना बेहतर है, हालांकि!
185 के साथ तुलना में 145 बिट्स ! यह 40 बिट की बचत है, या सिर्फ 20% से अधिक है! (यह, निश्चित रूप से, यह मानते हुए कि संरचना के बारे में जानकारी डिकोडिंग के लिए उपलब्ध है।) यह कोडिंग इष्टतम है क्योंकि किसी भी चरित्र के प्रतिनिधित्व को बदलकर और अधिक बिट्स नहीं गिराए जा सकते।
काम
- एक पैरामीटर के साथ एक प्रोग्राम या फ़ंक्शन लिखें ...
- एसटीडीआईएन (या समतुल्य) या एकल तर्क के रूप में इनपुट लेता है।
- एक इष्टतम हफमैन कोडिंग को आउटपुट के रूप में आवृत्ति के अनुसार क्रमबद्ध किया जाता है (एक आवृत्ति वर्ग के भीतर क्रम कोई फर्क नहीं पड़ता)।
- आप मान सकते हैं कि इनपुट में वर्ण ASCII सीमा
32..126
और एक नई रेखा तक ही सीमित हैं । - आप मान सकते हैं कि इनपुट 10,000 वर्णों से अधिक नहीं है (आदर्श रूप में, सिद्धांत रूप में, इनपुट अनबाउंड होना चाहिए)।
- आपका कोड यथोचित तेजी से समाप्त होना चाहिए। ऊपर दिए गए उदाहरण में एक मिनट या उससे अधिक नहीं लेना चाहिए। (यह क्रूर बल से शासन करने का इरादा है।)
- स्कोरिंग बाइट्स में है।
उदाहरण
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
हैप्पी कोडिंग!
ध्यान दें कि यह समान प्रश्न बारीकी से संबंधित है, यहां तक कि इस बात के लिए कि यह एक डुप्लिकेट है। हालांकि, मेटा पर अब तक आम सहमति यह है कि पुराने को इस एक की नकल माना जाना चाहिए।
this question is about huffman coding
, मैं बिट्स की संख्या गणना हो 145 , नहीं 136.