अंकगणितीय संपीड़न के साथ मुख्य विचार यह संभाव्यता को आवश्यक डेटा लंबाई की सटीक मात्रा का उपयोग करके कोड करने की क्षमता है।
डेटा की इस राशि में जाना जाता है, शैनन द्वारा सिद्ध, और निम्न सूत्र का उपयोग करके बस गणना की जा सकती: -log2 (पी)
उदाहरण के लिए, पी = 50% है, तो आप 1 बिट की जरूरत है। और यदि पी = 25%, तो आपको 2 बिट्स की आवश्यकता है।
यह संभावनाओं के लिए काफी आसान है जो 2 की शक्ति हैं (और इस विशेष मामले में, हफमैन कोडिंग पर्याप्त हो सकती है)। लेकिन क्या होगा यदि संभावना 63% है? फिर आपको -log2 (0.63) = 0.67 बिट्स की आवश्यकता है। मुश्किल लगता है ...
यह संपत्ति विशेष रूप से महत्वपूर्ण है यदि आपकी संभावना अधिक है। यदि आप 95% सटीकता के साथ कुछ भविष्यवाणी कर सकते हैं, तो आपको अच्छे अनुमान का प्रतिनिधित्व करने के लिए केवल 0.074 बिट्स की आवश्यकता है। जिसका मतलब है कि आप बहुत कम करने जा रहे हैं।
अब, यह कैसे करें?
अच्छा, यह लगता है की तुलना में यह आसान है। आप संभावनाओं के आधार पर अपनी सीमा विभाजित करेंगे। उदाहरण के लिए, यदि आपके पास 100, 2 संभावित घटनाएं हैं, और पहली बार 95% की संभावना है, तो पहले 95 मान "इवेंट 1" कहेंगे, और अंतिम 5 शेष मान "इवेंट 2" कहेंगे ।
ठीक है, लेकिन कंप्यूटर पर, हम 2 शक्तियों का उपयोग करने के आदी हैं। उदाहरण के लिए, 16 बिट्स के साथ, आपके पास 65536 संभावित मानों की एक श्रृंखला है। बस वही करें: "इवेंट 1" कहने के लिए श्रेणी का पहला 95% (जो 62259 है) ले लो, और शेष "इवेंट 2" कहें। आपको स्पष्ट रूप से "गोल करने" (परिशुद्धता) की समस्या है, लेकिन जब तक आपके पास वितरित करने के लिए पर्याप्त मूल्य हैं, इससे कोई फर्क नहीं पड़ता। इसके अलावा, आप 2 घटनाओं तक सीमित नहीं हैं, आप कई घटनाओं को प्राप्त कर सकते हैं। यह सब मायने रखता है कि प्रत्येक घटना की संभावनाओं के आधार पर मूल्य आवंटित किए जाते हैं।
ठीक है, लेकिन अब मेरे पास "ईवेंट 1" और 3277 "इवेंट 2" कहने के लिए 62259 संभावित मान हैं। मुझे किसे चुनना चाहिए ? ठीक है, उनमें से कोई भी करेगा। गीलेर यह 1, 30, 5500 या 62256 है, इसका अभी भी "इवेंट 1" का अर्थ है।
वास्तव में, यह तय करना कि कौन सा मूल्य चुनना है, वर्तमान अनुमान पर निर्भर नहीं होगा, लेकिन अगले पर।
मान लीजिए कि मेरे पास "ईवेंट 1" है। तो अब मुझे 0 और 62256 के बीच कोई मूल्य चुनना है। अगले अनुमान पर, मेरे पास एक ही वितरण है (95% इवेंट 1, 5% इवेंट 2)। मैं बस इन संभावनाओं के साथ वितरण मानचित्र आवंटित करूंगा। इसके अलावा, इस बार, यह 62256 मूल्यों पर वितरित किया जाता है। और हम इस तरह जारी रखते हैं, प्रत्येक अनुमान के साथ मूल्यों की सीमा को कम करते हैं।
तो वास्तव में, हम "श्रेणियां" परिभाषित कर रहे हैं, जो प्रत्येक अनुमान के साथ संकीर्ण हैं। हालांकि, कुछ बिंदु पर, सटीकता की एक समस्या है, क्योंकि बहुत कम मूल्य रहते हैं।
विचार, बस फिर से श्रेणी को "फुलाएं" है। उदाहरण के लिए, प्रत्येक बार रेंज 32768 (2^15) से नीचे जाती है, तो आप उच्चतम बिट आउटपुट करते हैं, और बाकी को 2 से गुणा करते हैं (प्रभावी रूप से मूल्यों को एक बिट बाएं स्थानांतरित करते हैं)। लगातार इस तरह से, आप बिट्स को एक-एक करके आउटपुट कर रहे हैं, क्योंकि उन्हें अनुमानों की श्रृंखला से निपटारा जा रहा है।
अब संपीड़न के साथ संबंध स्पष्ट हो जाता है: जब सीमा तेजी से संकुचित हो जाती है (पूर्व: 5%), तो आप सीमा से ऊपर की सीमा को वापस पाने के लिए बहुत सारी बिट्स आउटपुट करते हैं। दूसरी ओर, जब संभावना बहुत अधिक है, तो सीमा बहुत धीरे-धीरे संकीर्ण होती है। आप अपनी पहली बिट्स को आउटपुट करने से पहले भी कई अनुमान लगा सकते हैं। इस तरह एक घटना को "थोड़ा सा अंश" में संपीड़ित करना संभव है।
मैंने जानबूझकर इस आलेख को सामान्य रखने के लिए "संभावना", "अनुमान", "घटनाओं" शब्द का उपयोग किया है। लेकिन डेटा संपीड़न के लिए, आप उन्हें अपने डेटा को मॉडल करने के तरीके के साथ प्रतिस्थापित करने के लिए। उदाहरण के लिए, अगली घटना अगले बाइट हो सकती है; इस मामले में, आपके पास 256 हैं।
अब मैं सवाल समझता हूं। –
आप अंकगणितीय एन्कोडिंग के साथ-साथ एल्गोरिदम [आर्टूरो सैन एमेटेरियो कैम्पोस द्वारा इस आलेख में] (http://www.arturocampos.com/ac_arithmetic.html) के लिए एक बहुत विस्तृत स्पष्टीकरण पा सकते हैं। इसके अलावा आप [इस पोस्ट] में इन एल्गोरिदम के लिए सी ++ कार्यान्वयन देख सकते हैं (http://stackoverflow.com/a/10017164/1009831)। –