Haskell का उपयोग करके Huffman code-आधारित डेटा compression utility का विकास
(lazamar.github.io)Huffman coding का उपयोग करके data compression प्रोग्राम का इम्प्लीमेंटेशन
- Huffman code क्या है?
- हर character को एक unique bit sequence से मैप करके data compression किया जाता है
- जो character बार-बार आते हैं, उन्हें छोटे bit sequence से, और जो कम आते हैं, उन्हें लंबे bit sequence से मैप किया जाता है
- उदाहरण: string
aaabके मामले में,aको1,bको0मैप किया जाता है, इसलिए इसे1110के रूप में compress किया जाता है
Prefix-free code
- Prefix-free code क्या है?
- ऐसा सुनिश्चित किया जाता है कि कोई भी code word किसी दूसरे code word का prefix न बने
- उदाहरण:
aaabcके मामले में,aको1,bको00,cको01मैप किया जाता है, इसलिए इसे1110001के रूप में compress किया जाता है
Prefix-free code बनाना
- Prefix-free code बनाने की विधि
- सभी characters को एक complete binary tree की leaves पर रखा जाता है
- बाईं branch को
1, दाईं branch को0से label किया जाता है - root से leaf तक का path हर character के code word को दर्शाता है
Encoder लिखना
-
Type definitions
Bit,Code,FreqMap,CodeMap,Weight,HTreetype define किए जाते हैंHTreeLeafऔरForkसे मिलकर बना होता है
-
Encoding function
- string को bits में बदलने वाला function
FreqMapका उपयोग करके हर character की frequency गिनी जाती है, और उसी के आधार पर Huffman tree बनाई जाती है- Huffman tree से हर character का code word बनाया जाता है
-
Decoding function
- bits को वापस मूल string में बदलने वाला function
- Huffman tree का उपयोग करके bits को क्रमवार decode किया जाता है
Binary file के साथ इंटिग्रेशन
- Binary data encoding
Data.ByteString.Char8module का उपयोग करके bytes को characters के रूप में पढ़ा जाता है- text coder का उपयोग करके binary data को encode किया जाता है
Serialization
- Serialization function
FreqMapऔर bits को वास्तविक bytes में बदलकर file में स्टोर किया जाता हैPutmonad का उपयोग करके efficientByteStringबनाया जाता है
Deserialization
- Deserialization function
- file से पढ़े गए data को
FreqMapऔर bits में बदला जाता है Getmonad का उपयोग करकेFreqMapको deserialize किया जाता है
- file से पढ़े गए data को
पूरे कोड का इंटीग्रेशन
- File compression और decompression function
compressfunction: file को पढ़कर frequency map बनाता है, data को encode करता है, और उसे compressed file के रूप में स्टोर करता हैdecompressfunction: compressed file को पढ़ता है, data को decode करता है, और उसे मूल file के रूप में स्टोर करता है
सुधार के बिंदु
-
Multithreading
- file के sections को parallel में decode किया जाता है
- section boundaries और expected decoding size बताने वाली table जोड़कर parallel processing संभव बनाई जाती है
-
Single-pass encoding
- frequency map को real time में बनाते हुए encoding की जाती है
- file की शुरुआत में frequency map शामिल करने की आवश्यकता नहीं होती
-
Canonical Huffman code
- tree traverse करने के बजाय vector indexing के जरिए
O(1)time complexity में decode किया जाता है
- tree traverse करने के बजाय vector indexing के जरिए
-
तेज़ code generation
- अगर single-pass encoding की कोशिश की जाए, तो code map generation की speed बढ़ानी होगी
GN⁺ की राय
-
Huffman coding के फायदे
- बार-बार आने वाले characters को छोटे bit sequence से मैप करके efficient data compression संभव बनाता है
- memory usage को न्यूनतम रखते हुए भी बड़े data को प्रोसेस किया जा सकता है
-
Haskell के फायदे
- functional programming के फायदों का उपयोग करके modular code लिखा जा सकता है
- lazy evaluation के जरिए memory usage को optimize किया जा सकता है
-
मिलते-जुलते फीचर वाले प्रोजेक्ट
- gzip, bzip2 जैसे कई data compression tools मौजूद हैं
- हर tool के फायदे-नुकसान की तुलना करके उपयुक्त tool चुनना महत्वपूर्ण है
-
नई तकनीक अपनाते समय ध्यान देने योग्य बातें
- performance और memory usage को ध्यान में रखकर उपयुक्त algorithm चुनना चाहिए
- single-pass encoding जैसी optimization techniques लागू करके efficiency बढ़ाई जा सकती है
1 टिप्पणियां
Hacker News राय
array-आधारित in-place algorithm मौजूद हैं, जिससे tree allocate करने और pointers को track करने की ज़रूरत कम हो जाती है
यह कहना तकनीकी रूप से सही नहीं है कि code words किसी दूसरे code word का prefix नहीं बनने चाहिए
यह जानने की जिज्ञासा है कि क्या Haskell प्रोग्राम लिखने की और उन्नत सुविधाओं, जैसे monad transformers, lenses आदि, पर कोई समान tutorial है
Coursera के functional programming course (Scala) में इसी तरह का Huffman coding assignment दिया जाता है
Huffman codes का उपयोग करके MICMAC processor macro program को न्यूनतम microcycles और microinstructions के साथ चलाया गया था
Huffman coding पर अतिरिक्त जानकारी: Rosetta Code Huffman Coding
Haskell programmers के लिए सवाल: optimized code लिखना चाहने वाले programmer के लिए Haskell की performance कैसी है, यह जानने की जिज्ञासा है
साझा करने के लिए धन्यवाद वाली राय
"Creating prefix-free codes" section की table में typo है
arithmetic coding लगभग हर मायने में बेहतर है