डेटा कंप्रेशन क्या है और क्यों ज़रूरी है?
कंप्रेशन का मतलब है वही जानकारी कम बिट में रखना। एनकोडर नाम का प्रोग्राम फ़ाइल छोटी करता है और डिकोडर उसे फिर खोलता है।
- कम स्टोरेज: फ़ोन में ज़्यादा फ़ोटो और गाने आ जाते हैं।
- तेज़ ट्रांसफ़र: छोटी फ़ाइल जल्दी डाउनलोड-अपलोड होती है और कम डेटा खर्च होता है।
- कम बैंडविड्थ: धीमे नेटवर्क पर भी वीडियो कॉल और स्ट्रीमिंग चलती है।
कंप्रेशन इसलिए काम करता है क्योंकि असली डेटा में फ़ालतू दोहराव (redundancy) होता है: बार-बार आने वाले मान, आम अक्षर, या ऐसी बारीकी जो आँख-कान पकड़ नहीं पाते। इसकी कीमत समय है: कंप्रेस और डीकंप्रेस करने में कंप्यूटर को मेहनत करनी पड़ती है।
लॉसलेस और लॉसी कंप्रेशन
लॉसलेस (Lossless) कंप्रेशन बिल्कुल वही मूल बिट लौटाता है। टेक्स्ट, प्रोग्राम फ़ाइल, स्प्रेडशीट जैसी चीज़ों में एक भी बिट गलत नहीं चल सकता, वहाँ यही चाहिए। उदाहरण: ZIP, PNG, GIF, FLAC।
लॉसी (Lossy) कंप्रेशन वह बारीकी हटाता है जो लोग शायद नोटिस न करें: फ़ोटो में रंग के बहुत छोटे बदलाव, संगीत में बहुत ऊँची या दबी हुई आवाज़ें। फ़ाइल बहुत छोटी हो जाती है, पर हटा डेटा हमेशा के लिए चला जाता है। उदाहरण: JPEG फ़ोटो, MP3 और AAC संगीत, MP4 वीडियो।
| लॉसलेस | लॉसी | |
|---|---|---|
| मूल वापस? | हाँ, बिल्कुल | नहीं, मिलती-जुलती कॉपी |
| बचत | कम | बहुत ज़्यादा |
| किसके लिए | टेक्स्ट, कोड, डेटा | फ़ोटो, संगीत, वीडियो |
रन-लेंथ एनकोडिंग (RLE)
रन यानी एक जैसे मानों का लगातार समूह। RLE हर रन को एक जोड़े के रूप में रखता है: (गिनती, मान)।
उदाहरण: WWWWWWBBBWWWWWWW बन जाता है 6W 3B 7W, या सफ़ेद = 0 और काला = 1 मानें तो 6 0 3 1 7 0।
RLE बड़े सपाट रंग वाले चित्रों (आइकन, कार्टून, स्कैन पेज) के लिए बढ़िया है। अगर मान कम दोहराते हैं तो डेटा बड़ा भी हो सकता है: ABCD बन जाता है 1A 1B 1C 1D, यानी दोगुना।
हफ़मैन कोडिंग और डिक्शनरी तरीके
साधारण ASCII हर अक्षर को 8 बिट देता है। हफ़मैन कोडिंग ज़्यादा आने वाले अक्षर को छोटा कोड और कम आने वाले को लंबा कोड देती है।
- गिनो कि हर अक्षर कितनी बार आता है।
- सबसे कम गिनती वाले दो को जोड़कर एक नोड बनाओ; उसकी गिनती दोनों का योग होगी।
- यह तब तक दोहराओ जब तक एक ही पेड़ (tree) न बचे।
- जड़ (root) से कोड पढ़ो: बाईं शाखा = 0, दाईं = 1।
ABRACADABRA में: A×5, B×2, R×2, C×1, D×1। एक हफ़मैन पेड़ से A = 0, R = 10, B = 110, C = 1110, D = 1111। कुल = 5×1 + 2×2 + 2×3 + 1×4 + 1×4 = 23 बिट, जबकि 11 × 8 = 88 बिट लगते।
हफ़मैन कोड प्रीफ़िक्स-फ़्री होते हैं: कोई कोड किसी दूसरे कोड की शुरुआत नहीं होता, इसलिए डिकोडर कभी उलझता नहीं। पेड़ (या कोड टेबल) फ़ाइल के साथ रखना पड़ता है।
डिक्शनरी तरीके
LZ जैसे तरीके (ZIP और PNG में) पहले देखे गए पैटर्न की एक डिक्शनरी रखते हैं। पैटर्न दोबारा आए तो पूरा पैटर्न लिखने की जगह छोटा-सा संदर्भ लिखते हैं ("12 जगह पीछे जाओ, 5 कॉपी करो")।
कंप्रेशन को नापना
कंप्रेशन अनुपात = मूल साइज़ ÷ कंप्रेस्ड साइज़। 10 MB की फ़ाइल 2 MB बन जाए तो अनुपात 5 : 1।
बची जगह = (मूल − कंप्रेस्ड) ÷ मूल × 100%। यहाँ (10 − 2) ÷ 10 = 80%।
चित्र के लिए: कच्चा साइज़ (बिट) = चौड़ाई × ऊँचाई × कलर डेप्थ। प्रति पिक्सेल कम बिट या कम पिक्सेल = छोटी फ़ाइल, पर कम क्वालिटी। अच्छा चुनाव क्वालिटी, साइज़ और गति में संतुलन रखता है।
मुख्य सूत्र और परिभाषाएँ
- कंप्रेशन अनुपात = मूल साइज़ ÷ कंप्रेस्ड साइज़
- बची जगह (%) = (मूल − कंप्रेस्ड) ÷ मूल × 100
- RLE: हर रन → (गिनती, मान)
- हफ़मैन कुल बिट = Σ (बारंबारता × कोड की लंबाई)
- बिना कंप्रेशन टेक्स्ट बिट = अक्षरों की संख्या × प्रति अक्षर बिट
- कच्चे चित्र के बिट = चौड़ाई × ऊँचाई × कलर डेप्थ
हल किए गए उदाहरण
1. AAAABBBCCD को RLE से लिखो।
रन: AAAA, BBB, CC, D। RLE: 4A 3B 2C 1D। 10 अक्षर 8 चिह्न (4 जोड़े) बन गए।
2. 12 MB का वीडियो 3 MB में कंप्रेस होता है। अनुपात और बची जगह निकालो।
अनुपात = 12 ÷ 3 = 4 : 1। बचत = (12 − 3) ÷ 12 × 100 = 75%।
3. (a) वर्ड प्रोसेसर में स्कूल रिपोर्ट, (b) सोशल मीडिया के लिए छुट्टियों की फ़ोटो — किसमें कौन-सा कंप्रेशन?
(a) लॉसलेस — हर अक्षर बिल्कुल सही रहना चाहिए। (b) लॉसी (JPEG) — रंग की थोड़ी बारीकी जाए तो चलेगा, फ़ाइल बहुत छोटी हो जाएगी।
4. अक्षर: E×6, T×3, A×2, Z×1। हफ़मैन कोड E = 0, T = 10, A = 110, Z = 111। कुल कितने बिट? 8-बिट ASCII में कितने?
हफ़मैन: 6×1 + 3×2 + 2×3 + 1×3 = 6 + 6 + 6 + 3 = 21 बिट। ASCII: 12 अक्षर × 8 = 96 बिट। अनुपात ≈ 4.6 : 1।
5. A = 0, R = 10, B = 110 से 0101100 को डिकोड करो।
बाएँ से पढ़ो, कोई कोड मिलते ही रुको: 0 → A, 10 → R, 110 → B, 0 → A। उत्तर: ARBA।
6. 1000 × 800 का चित्र 24-बिट रंग में है। कच्चा साइज़ kB में? लॉसी कंप्रेशन से 120 kB फ़ाइल बनी, अनुपात क्या?
बिट = 1000 × 800 × 24 = 19 200 000। बाइट = 2 400 000 = 2400 kB। अनुपात = 2400 ÷ 120 = 20 : 1।
आम गलतियाँ
- यह सोचना कि लॉसी फ़ाइल को खोलकर फिर से मूल मिल जाएगा। हटाई गई बारीकी हमेशा के लिए गई।
- कम दोहराव वाले डेटा पर RLE लगाना। ABCDEF बन जाता है 1A1B1C1D1E1F, जो और बड़ा है।
- सबसे ज़्यादा आने वाले अक्षर को सबसे लंबा हफ़मैन कोड देना। उल्टा है: ज़्यादा आने वाला = छोटा कोड।
- अनुपात उल्टा लिखना। अनुपात = मूल ÷ कंप्रेस्ड, इसलिए फ़ाइल छोटी हो तो यह 1 से बड़ा आता है।