एक किलोबाइट ब्लॉक और पॉइंटर्स के सभी संभावित क्रमपरिवर्तन की स्मृति संभव है?


23

यह मेरे सिर को चारों ओर लपेटने के लिए एक कठिन पर्याप्त विचार है और मैं किसी भी संपादन की सराहना करता हूं / इसे जानने वालों के लिए अधिक पठनीय बनाने में मदद करता हूं।

क्या एक हार्ड ड्राइव होना सैद्धांतिक रूप से संभव है जो उस पर एक किलोबाइट के हर संभव द्विआधारी क्रमांकन की एक प्रतिलिपि सहेजा गया है और फिर बाकी सिस्टम को बस इन स्थानों पर संकेत बनाने के लिए है?

क्या इस तरह से बनाई गई प्रणाली सीधे सीधे संग्रहीत जानकारी की तुलना में किसी भी तरह से तेज़ होगी?

दूसरा तरीका समझाने के लिए, वाक्य होने के बजाय कहें:

"हैलो, मैं बॉब हूं।" और "वह सैंडविच स्वादिष्ट लगता है।"

... हार्ड ड्राइव पर संग्रहीत, हमारे पास वर्णमाला और अन्य वर्णों के सभी क्रमांकन कुछ संख्या तक होंगे (जैसे, 1000 वर्ण या तो), और फिर हमारे वाक्य को कुछ इस तरह से संग्रहीत करें:

[सूचक # 21381723]


21
आप विचार करना चाह सकते हैं कि कितने अनोखे अंग्रेजी ट्वीट संभव हैं? दुनिया की आबादी को उन सभी को ज़ोर से पढ़ने में कितना समय लगेगा? । आप बहुत बड़ी संख्या के साथ काम कर रहे हैं।

आपको यह दिलचस्प लग सकता है कि कैसे git काम करता है, जिसे पता योग्य सामग्री कहा जाता है
जडलुगोस

5
github.com/philipl/pifs आपके विचार के समान प्रिंसिपल पर आधारित है, केबी के सभी क्रमपरिवर्तन के बजाय, यह pi का उपयोग करता है।
20

12
आपके पॉइंटर्स को 1-किलोबाइट लंबा होना होगा। आप उन ब्लॉकों को संग्रहीत नहीं करने का विकल्प चुन सकते हैं जो अंग्रेजी में समझ में नहीं आते हैं - जिस स्थिति में आपने स्वतंत्र रूप से संपीड़न के विचार को पुन: स्थापित किया है!
user253751

मूल उत्तर नहीं है - क्रमपरिवर्तन के # और आकार के कारण यह असंभव है लेकिन आप क्या संभावित आवेदन सोच रहे थे यदि यह संभव था तो इसके लिए उपयोगी होगा ??
महादूत

जवाबों:


91

2 8192 संभव विभिन्न 1K ब्लॉक हैं। उन सभी को संग्रहीत करने में 2 8202 बिट्स का भंडारण होगा। चूंकि ब्रह्मांड में लगभग 10 80 (या ~ 2 266 ) कण होते हैं, इसलिए यह एक सुरक्षित शर्त है कि उन सभी को संग्रहीत करना संभव नहीं है, और आपको आश्चर्य नहीं है कि यह समय बचाएगा या नहीं।

लेकिन वास्तव में, इसका जवाब देने का एक और दिलचस्प तरीका है। आप स्थिरांक के एक विशाल पूल में एक सूचकांक बनाने का सुझाव दे रहे हैं। लेकिन आप यह कैसे जानेंगे कि किस सूचकांक को डीरेंस किया जाए? एक तर्क की खातिर कल्पना कीजिए कि आप संग्रहीत करना चाहते हैं केवल 1-चरित्र ब्लॉक: a, b, c... मुमकिन है अपने सूचकांक होगा 0, 1, 2 आदि, के बाद से है कि उन ब्लॉकों के भंडारण के लिए सबसे कारगर लेआउट है।

क्या आप व्यवस्था के बारे में कुछ नोटिस करते हैं? आपका सूचकांक वास्तव में, संग्रहीत डेटा का एक कोडित प्रतिनिधित्व है ! दूसरे शब्दों में, आपको बिल्कुल भी हस्तक्षेप करने की आवश्यकता नहीं है, आपको बस सूचकांक को अपने इच्छित डेटा में बदलना होगा।

जब आप किसी तालिका में किसी चीज़ के सभी संभावित मूल्यों को संग्रहीत करते हैं, तो यह हमेशा होता है: आपका सूचकांक केवल डेटा का केवल एक एन्कोडेड संस्करण बन जाता है, इसलिए डेटा को संग्रहीत करना पहली जगह में अनावश्यक हो जाता है। यही कारण है कि असली दुनिया में, सूचकांक विरल डेटा (जैसे सभी वेब पृष्ठों को आपके द्वारा देखे गए नहीं सभी वेब पृष्ठों है कि के लिए ही उपयोगी हैं मौजूद हो सकता है , या यहाँ तक कि सभी करते अस्तित्व)।


17
तो, एक तरह से, हम पहले से ही इस प्रणाली का उपयोग कर रहे हैं - लेकिन हम इसे किलोबाइट आकार के बिट पैटर्न के आलसी मूल्यांकन के साथ कर रहे हैं, जो हमें टन के भंडारण स्थान को बचाने की अनुमति देता है !
थियोडोरोस चट्जीगनिनाकिस

3
भंडारण थोड़ा कम हो जाता है, ओवरलैप के कारण (1024 शून्य के बाद 1024 लोगों में 1025 अद्वितीय पैटर्न होते हैं) ... कम लेकिन अभी भी असंभव बड़े हैं। इसके अलावा, 1KB ब्लॉक 2 <सुप> 13 </ sup> बिट्स है, 2 <सुप> 10 </ sup> नहीं।
बेन Voigt

2
ध्यान दें कि ब्रह्मांड में कणों पर 10 ^ 80 सीमा का मतलब यह नहीं है कि आप ब्रह्माण्ड में 10 ^ 80 बिट्स से अधिक स्टोर नहीं कर सकते, क्योंकि प्रत्येक कण के साथ आप संभावित रूप से एक से अधिक जानकारी संग्रहीत कर सकते हैं ( ब्रह्मांड के भीतर इसकी स्थिति के आधार पर, और संभवतः इसका वेग आदि)। इसका मतलब यह नहीं है कि आप हर 1K ब्लॉक को स्टोर कर सकते हैं - हालांकि उन लोगों की संख्या कणों की संख्या को एक बड़े पैमाने पर बड़ी मात्रा में पार करती है, इसलिए यह अभी भी एक बहुत ही सुरक्षित शर्त है जो आप उन सभी को स्टोर नहीं कर सकते हैं!
psmears

2
@ नील अगर आपके पास एक कोडिंग प्रणाली है जो आपको "10 ^ 80" के रूप में एन्कोडिंग करके 10 ^ 80 स्टोर करने की अनुमति देती है तो आप "10 ^ 80" को कैसे स्टोर करते हैं? यदि डेटा के कुछ टुकड़े वास्तविक डेटा से कम एन्कोडेड हैं, तो अन्य को लंबे समय तक एन्कोड किया जाना है। या यदि आपके डेटा के सभी टुकड़े नंबर हैं, तो आप प्रत्येक दशमलव अंक को पूरी बाइट के रूप में संग्रहीत कर रहे हैं।
198 में रैंडम 832

3
साथ डी Bruijn दृश्यों 2 ^ 1024 बिट पर्याप्त होगा।
ग्रोनोस्तज

20

जैसा कि दूसरों ने पहले ही बताया है, आपके पास 1k ब्लॉक के लिए 2 ^ 8192 संभावनाएं हैं। इसका मतलब है कि आपको ब्लॉक के पते को सांकेतिक शब्दों में बदलना के लिए 8192 बिट्स की आवश्यकता होगी यदि सभी ब्लॉकों के पते बिट्स की समान मात्रा के साथ एन्कोड किए गए हैं, तो आपके पते 1k लंबे होंगे। अप्रत्यक्ष की एक परत जोड़ने के अलावा आपको कुछ भी प्राप्त नहीं होगा, ताकि आप कोई प्रदर्शन हासिल न कर सकें।

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


1

इसके साथ दो समस्याएं हैं।

सबसे पहले, "एक किलोबाइट के सभी संभव बाइनरी क्रमांकन" डेटा की एक बड़ी मात्रा है। 1024 बाइट्स * एक बाइट में 8 बाइट प्रति = 8192 बिट्स। सभी संभावित क्रमपरिवर्तन 2 ^ 8192 होंगे। यह 1.09e+2466किलोबाइट के आसपास है ! (तुलना के प्रयोजनों के लिए, 1 टीबी ड्राइव 1e09किलोबाइट है।)

दूसरा, भले ही आपके पास इतनी बड़ी तालिका हो, और आपने सूचक के साथ इसे अनुक्रमित किया, यदि आप कुछ डेटा को ठीक 1 केबी से छोटा बताना चाहते हैं, तो आप क्या करेंगे?


2
इसके अलावा 1 केबी से छोटे सभी ब्लॉक को स्टोर करने से वह ज्यादा जगह नहीं लेगा। केवल बाइट के आकार वाले ब्लॉकों को मानते हुए, छोटे ब्लॉकों का आकार 1-KB-ब्लॉकों के आकार के 1/256 से थोड़ा अधिक है। बिट-आकार के ब्लॉकों को मानते हुए, आप फिर से उसी आकार के बारे में जोड़ते हैं।
पाओलो एबरमन

-1

जैसा कि अन्य पोस्टरों ने बताया है, किसी बिंदु पर, सूचक के आकार को आपकी सभी संभावित मूल्यों की सूची में सूचीबद्ध करने की आवश्यकता होती है, जो आपके लाभ को कम कर देता है।

हालाँकि, कुछ भाषाएँ स्मृति उपयोग को अनुकूलित करने के लिए आपके द्वारा सुझाए गए सीमित संस्करण का उपयोग करती हैं। पाइथन मेमोरी में डुप्लिकेट स्ट्रिंग्स की संख्या को कम करने के लिए स्ट्रिंग 'इंटर्निंग' का उपयोग करता है। आप 'अजगर स्ट्रिंग इंटर्न' की खोज करके अधिक जानकारी प्राप्त कर सकते हैं।


1
ओपी एक घने सेट के बारे में पूछ रहा है, जिसमें हर क्रमपरिवर्तन है। पॉइंटर्स केवल विरल डेटा के लिए उपयोगी होते हैं, जहां एक पॉइंटर को रखने के लिए आवश्यक बिट्स इंगित किए गए बिट्स से छोटे होते हैं। यदि डुप्लिकेट हैं, तो इंटरस्टिंग स्पेस को अधिक विरल बना सकता है, इसलिए वहां एक कनेक्शन है, लेकिन आपका जवाब वास्तव में इसे अच्छी तरह से वाक्यांश नहीं देता है।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.