न्यूमेरिक रेंज को स्टोर करने का सबसे कुशल तरीका क्या है?


29

यह प्रश्न एक सीमा को संग्रहीत करने के लिए कितने बिट्स की आवश्यकता है। या किसी अन्य तरीके से, बिट्स की संख्या के लिए, अधिकतम सीमा क्या है जिसे संग्रहीत किया जा सकता है और कैसे?

कल्पना करें कि हम 0-255 की सीमा के भीतर एक उप-श्रेणी को संग्रहीत करना चाहते हैं।

तो उदाहरण के लिए, 45-74।

हम ऊपर दिए गए उदाहरण को दो अहस्ताक्षरित बाइट्स के रूप में संग्रहीत कर सकते हैं, लेकिन यह मुझे चौंकाता है कि वहाँ जानकारी का कुछ अतिरेक होना चाहिए। हम जानते हैं कि दूसरा मूल्य पहले से बड़ा है, इसलिए इस मामले में कि पहला मूल्य बड़ा है, दूसरे मूल्य के लिए कम बिट्स की आवश्यकता होती है, और इस मामले में कि दूसरा मूल्य बड़ा है, पहले के लिए कम बिट्स की आवश्यकता होती है ।

मुझे संदेह है कि किसी भी संपीड़न तकनीक में मामूली परिणाम होगा, इसलिए यह पूछना बेहतर होगा कि "अधिकतम सीमा क्या है जो एक बाइट में संग्रहीत की जा सकती है?"। यह दो नंबरों को अलग-अलग स्टोर करके प्राप्त करने से बड़ा होना चाहिए।

क्या इस तरह की चीज़ करने के लिए कोई मानक एल्गोरिदम हैं?


क्या आपको भी रेंज की शुरुआत स्टोर करनी है?
इवान

@ ईवान मैं वास्तव में पालन नहीं करता। ऊपर के उदाहरण में, 45 प्रारंभ (न्यूनतम) है और 74 अंत (अधिकतम) है और दोनों को संग्रहीत किया जाना है।
रगोम

2
तो यह सवाल है कि एक प्रकार की जगह कितनी होती है जो किसी भी रेंज को स्टोर कर सकती है। या कितनी जगह एक प्रकार है जो 45-74 स्टोर कर सकता है के लिए आवश्यकता होती है?
इवान

1
जबकि इस बारे में सोचना निश्चित रूप से अच्छा है, मुझे यकीन है कि आप वास्तविक अनुप्रयोगों में ऐसा नहीं करते हैं। कारण यह है कि वास्तविक अनुप्रयोगों की जटिलता इतनी बड़ी है कि हमें 100% से कम अनुकूलित कोड को स्वीकार करना होगा .... यही कारण है कि संकलक मौजूद हैं।
NoChance

3
@ रघु, मैं सहमत हूं, यहां तक ​​कि सबसे सरल आवश्यकता भी कोड की सैकड़ों लाइनें बनाती है। प्रत्येक त्रुटि प्रवण है। व्यक्तिगत रूप से, मैं सॉफ्टवेयर की जटिलता को बढ़ाने की तुलना में हार्डवेयर के लिए भुगतान करूंगा।
NoChance

जवाबों:


58

बस संभव पर्वतमाला की संख्या की गणना करें। कम बाउंड 0 (0-0, 0-1, ... 0-254, 0-255) के साथ 256 रेंज हैं, कम बाउंड 1 के साथ 255 रेंज, ... और अंत में कम बाउंड 255 (255-) के साथ 1 रेंज है। 255)। तो कुल संख्या (256 + 255 + ... + 1) = 257 * 128 = 32,896 है। चूंकि यह 2 15 = 32,768 से थोड़ा अधिक है , इसलिए आपको इस जानकारी को संग्रहीत करने के लिए कम से कम 16 बिट्स (2 बाइट्स) की आवश्यकता होगी।

सामान्य तौर पर, 0 से n-1 तक की संख्या के लिए, संभव श्रेणियों की संख्या n * (n + 1) / 2 है। यह 256 से कम है अगर n 22 या उससे कम है: n = 22 22 * ​​23/2 = 253 संभावनाएं देता है। तो एक बाइट 0-21 की उप-श्रेणियों के लिए पर्याप्त है ।

समस्या को देखने का एक और तरीका निम्नलिखित है: 0 से n-1 की सीमा में पूर्णांकों की एक जोड़ी को जमा करना लगभग 0- (n-1) की व्यवस्था को जमा करने के समान है, एक एकल बिट जो पहले संख्या को निर्धारित करता है। दूसरे से कम या अधिक है। (अंतर तब होता है जब दोनों पूर्णांक समान होते हैं, लेकिन यह अवसर तेजी से छोटा होता है, क्योंकि n बड़ा होता है।) यही कारण है कि आप केवल इस तकनीक के साथ एक बिट के बारे में बचा सकते हैं, और शायद इसका मुख्य कारण है कि इसका उपयोग शायद ही कभी किया जाता है।


धन्यवाद। N पर्वतमाला के लिए आवश्यक बिट्स की संख्या लॉग (n) / log2 है। वुल्फराम अल्फा में यह सब खिलाने से मुझे निम्नलिखित एक्सेल संगत सूत्र दिए गए, जो किसी दिए गए बिट्स की संख्या के लिए अधिकतम मूल्य की गणना करने के लिए संगत है: = INT ((SQRT (POWER (2, N + 3) + 1) - 1) - 2) )
rghome

9
TLDR यह है कि आप लगभग आधा लाभ प्राप्त करते हैं, इसलिए सामान्य तौर पर यह वास्तव में संपीड़ित करने के लायक नहीं है।
रगोम

हाँ, यह बड़े एन के लिए एक बिट जाता है लेकिन यह वास्तव में परेशानी के लायक नहीं है।
ग्लोरफाइंडेल

FYI करें, समीकरण में N + 3 अजीब लगता है, लेकिन 2 की एक शक्ति आपके समीकरण से आती है और अन्य दो द्विघात सूत्र के 4ac भाग से आती है।
रगोम

1
बीटीडब्ल्यू, आपकी गिनती खाली सीमा को छूट देती है, जिसके लिए सभी गैर-गिनती वाले संयोजन खड़े होते हैं। तो n * (n + 1) / 2 + 1,! एक miniscule परिवर्तन।
डेडुप्लिकेटर

17

इतनी कम संख्या में बिट्स के लिए, कई बिट्स को बचाने के लिए यह असंभव है क्योंकि ग्लोरफिंडेल ने बताया है । हालाँकि, यदि आप जिस डोमेन का उपयोग कर रहे हैं उसमें कुछ और बिट्स हैं, तो आप स्टार्ट वैल्यू और डेल्टा के साथ एन्कोडिंग रेंज द्वारा औसत केस के लिए महत्वपूर्ण बचत प्राप्त कर सकते हैं।

मान लें कि डोमेन पूर्णांक है, इसलिए 32 बिट्स हैं। भोली दृष्टिकोण के साथ, आपको एक सीमा को संग्रहीत करने के लिए 64 बिट्स (शुरू, अंत) की आवश्यकता होती है।

यदि हम (शुरू, डेल्टा) के एन्कोडिंग में जाते हैं, तो हम उस से सीमा के अंत का निर्माण कर सकते हैं। हम जानते हैं कि सबसे खराब स्थिति में, शुरुआत 0 है और डेल्टा में 32 बिट्स हैं।

2 ^ 5 32 है, इसलिए हम डेल्टा की लंबाई को पांच बिट्स (कोई शून्य लंबाई, हमेशा 1 जोड़ते हैं) में एन्कोड करते हैं, और एन्कोडिंग बन जाती है (प्रारंभ, लंबाई, डेल्टा)। सबसे खराब स्थिति में, यह 32 * 2 + 5 बिट्स है, इसलिए 69 बिट्स। तो सबसे खराब स्थिति में, यदि सभी रेंज लंबी हैं, तो यह खराब है तो भोली एन्कोडिंग है।

सबसे अच्छे मामले में, इसकी कीमत 32 + 5 + 1 = 38 बिट्स है।

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

हालाँकि, यदि आपके पास समान प्रारंभ बिंदुओं के आसपास बहुत सी श्रेणियां हैं, (उदाहरण के लिए क्योंकि आपको सेंसर से मान मिलते हैं), तो आप बड़ी बचत प्राप्त कर सकते हैं। आप उसी तकनीक को स्टार्ट वैल्यू पर लागू कर सकते हैं और स्टार्ट वैल्यू को ऑफसेट करने के लिए पूर्वाग्रह का उपयोग कर सकते हैं।

कहते हैं कि आपके पास 10000 रेंज हैं। श्रेणियों को एक निश्चित मूल्य के आसपास समूहीकृत किया जाता है। आप 32 बिट्स के साथ पूर्वाग्रह को एनकोड करते हैं।

भोले दृष्टिकोण का उपयोग करके, आपको उन सभी श्रेणियों को संग्रहीत करने के लिए 32 * 2 * 10 000 = 640 000 बिट्स की आवश्यकता होगी।

पूर्वाग्रह को एन्कोडिंग करने में 32 बिट्स लगते हैं, और प्रत्येक श्रेणी को एन्कोडिंग सबसे अच्छा मामले में 5 + 1 + 5 + 1 = 12 बिट्स लेता है, कुल 120 000 + 32 = 120 032 बिट्स के लिए। सबसे खराब स्थिति में, आपको कुल 740 032 बिट्स के लिए 5 + 32 + 5 + 32 बिट्स की आवश्यकता होती है, इस प्रकार 74 बिट्स।

इसका मतलब है, एक डोमेन पर 10 000 मानों के लिए जो 32 बिट्स को एन्कोड करने के लिए लेता है, हमें मिलता है

  • सबसे अच्छा मामले में स्मार्ट डेल्टा एन्कोडिंग के साथ 120 032 बिट्स
  • भोली शुरुआत, अंत एन्कोडिंग, हमेशा (कोई सबसे अच्छा या सबसे बुरा मामला) के साथ 640 000 बिट्स
  • सबसे खराब स्थिति में स्मार्ट डेल्टा एन्कोडिंग के साथ 740 032 बिट्स

अगर आप अनुभवहीन एनकोडिंग को आधार रेखा के रूप में लेते हैं, तो इसका मतलब है कि या तो 81.25% तक की बचत या 15.625% तक अधिक लागत।

आपके मूल्यों को कैसे वितरित किया जाता है, इसके आधार पर, वे बचत महत्वपूर्ण हैं। अपने व्यापार डोमेन को जानें! जानिए आप क्या एनकोड करना चाहते हैं।

विस्तार के रूप में, आप पूर्वाग्रह भी बदल सकते हैं। यदि आप डेटा का विश्लेषण करते हैं और मूल्यों के समूहों की पहचान करते हैं, तो आप डेटा को बाल्टियों में छाँट सकते हैं और प्रत्येक बाल्टी को अलग से अपने बायस के साथ एनकोड कर सकते हैं। इसका मतलब है कि आप इस तकनीक को न केवल उन श्रेणियों पर लागू कर सकते हैं, जिन्हें एक ही मूल्य के आसपास समूहीकृत किया गया है, बल्कि कई मानों के आसपास समूहीकृत की गई श्रेणियों के लिए भी।

यदि आपके प्रारंभ बिंदु समान रूप से वितरित किए जाते हैं, तो यह एन्कोडिंग वास्तव में अच्छी तरह से काम नहीं करती है।

यह एन्कोडिंग स्पष्ट रूप से सूचकांक के लिए बेहद खराब है। आप केवल x-th मान नहीं पढ़ सकते हैं। यह बहुत अधिक केवल क्रमिक रूप से पढ़ा जा सकता है। जो कुछ स्थितियों में उपयुक्त है, उदाहरण के लिए नेटवर्क या बल्क स्टोरेज पर स्ट्रीमिंग (जैसे टेप या एचडीडी पर)।

डेटा का मूल्यांकन, इसे समूहीकृत करना और सही पूर्वाग्रह चुनना काफी काम हो सकता है और इष्टतम परिणामों के लिए कुछ ठीक-ट्यूनिंग की आवश्यकता हो सकती है।


8

इस तरह की समस्या क्लॉड शैनन के सेमिनल पेपर, ए मैथमेटिकल थ्योरी ऑफ कम्युनिकेशन का विषय है , जिसने "बिट" और कम या ज्यादा आविष्कार किए गए डेटा संपीड़न शब्द को पेश किया।

सामान्य विचार यह है कि किसी सीमा को एन्कोड करने के लिए उपयोग किए जाने वाले बिट्स की संख्या उस सीमा की संभावना के विपरीत आनुपातिक होती है। उदाहरण के लिए, मान लीजिए कि समय की 1/4 सीमा 45-74 दिखाई देती है। आप कह सकते हैं कि अनुक्रम 00 45-74 से मेल खाता है। 45-74 रेंज को एनकोड करने के लिए, आप "00" आउटपुट करते हैं और वहां रुक जाते हैं।

आइए यह भी मान लें कि 99-100 और 140-155 श्रेणी प्रत्येक समय के 1/8 के बारे में दिखाई देते हैं। आप उनमें से प्रत्येक को 3 बिट अनुक्रम के साथ एन्कोड कर सकते हैं। कोई भी 3 बिट्स तब तक करेंगे जब तक वे "00" के साथ शुरू नहीं करते हैं, जो पहले से ही 45-74 की सीमा के लिए आरक्षित है।

00: 45-74
010: 99-100
101: 140-155

आप इस तरीके से जारी रख सकते हैं जब तक कि हर संभव सीमा में एक एन्कोडिंग न हो। कम से कम संभावित सीमा को 100 से अधिक बिट्स की आवश्यकता हो सकती है। लेकिन यह ठीक है क्योंकि यह शायद ही कभी दिखाई देता है।

वहाँ रहे हैं एल्गोरिदम इष्टतम कोडिंग खोजने के लिए। मैं उन्हें यहाँ समझाने की कोशिश नहीं करूँगा, लेकिन आप ऊपर दिए गए लिंक पर जाकर या "सूचना सिद्धांत", "शैनन-फ़ानो कोडिंग", या "हफ़मैन कोडिंग" की खोज करके अधिक पा सकते हैं।

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


1
हाँ व्यापार डोमेन वास्तव में महत्वपूर्ण है। हमने वास्तव में शुरुआत की तारीख के लिए पूर्वाभ्यास के लिए हफ़मैन कोडिंग का उपयोग करने पर विचार किया, लेकिन वास्तविक दुनिया के आंकड़ों पर कुछ सांख्यिकीय विश्लेषण चलाने के बाद अंततः इसके खिलाफ फैसला किया। पूर्वाग्रह और डेल्टा के लिए एक ही एन्कोडिंग का उपयोग करने की सादगी अधिक महत्वपूर्ण थी तो शीर्ष पर हफमैन को जोड़ना, साथ ही आपको पूरे हफमैन पेड़ को भी भेजने की आवश्यकता है। यह हफमैन कोडिंग को ध्यान में रखते हुए एक अच्छा विचार है।
पॉलिग्नोम

1

@Glorfindel से उत्तर पर विस्तार करने के लिए:

जैसे n → ∞, (n - 1) → n। इस प्रकार, and (श्रेणियां) → n² / 2 और लॉग (Ω (पर्वतमाला)) → (2n - 1)। चूँकि भोली एन्कोडिंग 2 एन बिट्स लेती है, एसिम्प्टोटिक अधिकतम संपीड़न केवल 1 बिट बचाता है।


1

एक समान उत्तर है, लेकिन इष्टतम संपीड़न प्राप्त करने के लिए, आपको आवश्यकता है:

  1. एक इष्टतम एन्ट्रापी एन्कोडिंग विधि ( अंकगणित कोडिंग पर पढ़ा और अनिवार्य रूप से समतुल्य (एक ही संपीड़न अनुपात, थोड़ा तेज लेकिन समझ से भी कठिन) ANS )
  2. डेटा के वितरण के बारे में अधिक से अधिक जानकारी। महत्वपूर्ण रूप से, इसमें केवल "अनुमान लगाना" शामिल नहीं है कि एक संख्या कितनी बार दिखाई दे सकती है, लेकिन आप अक्सर निश्चित संभावनाओं को सुनिश्चित कर सकते हैं। उदाहरण के लिए, आप एक नकारात्मक अंतराल को परिभाषित कर सकते हैं, और संभवतः 0 आकार, इस बात पर निर्भर करता है कि आप एक वैध अंतराल को कैसे परिभाषित करते हैं। यदि आपके पास एक साथ सांकेतिक शब्दों में बदलना करने के लिए कई अंतराल हैं, तो आप उन्हें क्रमबद्ध कर सकते हैं, जैसे चौड़ाई कम करने के लिए, या प्रारंभ / समाप्ति मान बढ़ाने के लिए, और मानों की एक पूरी संख्या को नियंत्रित करते हैं (उदाहरण के लिए यदि आप चौड़ाई घटाकर एक आदेश की गारंटी देते हैं, तो पिछला अंतराल 100 की चौड़ाई थी, और अगले एक के लिए शुरुआती मूल्य 47 है, आपको केवल अंतिम मूल्यों के लिए 147 तक की संभावनाओं पर विचार करने की आवश्यकता है)।

महत्वपूर्ण रूप से, संख्या 2 का मतलब है कि आप चीजों को इस तरह से एन्कोड करना चाहते हैं कि सबसे अधिक जानकारीपूर्ण मान (प्रति बिट एन्कोडेड) पहले आते हैं। उदाहरण के लिए, जब मैंने एक सॉर्ट की गई सूची "जैसा है" को एन्कोडिंग करने का सुझाव दिया है, तो आमतौर पर इसे "बाइनरी ट्री" के रूप में एन्कोड करने के लिए होशियार होगा - अर्थात यदि वे चौड़ाई से क्रमबद्ध हैं, और आपके पास lenतत्व हैं, एन्कोडिंग तत्व से शुरू करें len/2। कहो कि यह चौड़ाई w था। अब आप सभी तत्वों को जानते हैं इससे पहले कि यह कहीं चौड़ाई [0, w] में है, और सभी तत्वों के बाद इसकी चौड़ाई कहीं [w, अधिकतम वैल आप स्वीकार करते हैं] है। पुनरावर्ती रूप से दोहराएं (प्रत्येक आधी सूची को फिर से आधे में विभाजित करें, आदि) जब तक आप lenतत्वों को कवर नहीं करते हैं (जब तक कि यह तय नहीं हो जाता है, आप सांकेतिक शब्दों में बदलना चाहते हैंlenपहले तो आपको टोकन समाप्त करने से परेशान होने की आवश्यकता नहीं है)। यदि "अधिकतम वैल आप स्वीकार करते हैं" वास्तव में खुला है, तो हो सकता है कि वह पहले उस उच्चतम मूल्य को एनकोड करें जो वास्तव में आपके डेटा में दिखाई देता है, अर्थात अंतिम तत्व, और फिर बाइनरी विभाजन करते हैं। फिर, जो कुछ भी सबसे पहले प्रति जानकारीपूर्ण है।

इसके अलावा, यदि आप पहले अंतराल की चौड़ाई को एन्कोडिंग कर रहे हैं, और आपको पता है कि आप जिस अधिकतम संभावित मूल्य के साथ काम कर रहे हैं, तो जाहिर है कि आप उन सभी शुरुआती मूल्यों को खारिज कर सकते हैं जो इसे अतिप्रवाह करेंगे ... आपको यह विचार मिलता है। अपने डेटा को इस तरह से ट्रांसफ़ॉर्म करें और ऑर्डर करें कि आप बाकी डेटा के बारे में जितना संभव हो सके उतना कम समझ सकें, और एक इष्टतम एन्ट्रापी एन्कोडिंग एल्गोरिथ्म सुनिश्चित करेगा कि आप बिट्स एनकोडिंग जानकारी को बर्बाद नहीं कर रहे हैं जो आपको "पहले से ही पता है" ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.