छोटे स्मृति पदचिह्न के साथ एक सेट कार्यान्वयन की तलाश में


9

मैं सेट डेटा प्रकार के कार्यान्वयन की तलाश कर रहा हूं। यानी हमें करना है

  • एक गतिशील सबसेट को बनाए रखने के (आकार के ब्रह्मांड से) {0, 1, 2, 3, \ dots, यू - 1 \} यू = \ आकार का यू के साथSnU={0,1,2,3,,u1}u
  • संचालन insert(x)(एक तत्व जोड़ने xके लिए S और) find(x)(जाँच करता है कि तत्व xका एक सदस्य है S )।

मुझे दूसरे ऑपरेशनों की परवाह नहीं है। अभिविन्यास के लिए, जिन अनुप्रयोगों में मैं काम कर रहा हूं, हमारे पास u1010

मुझे उन कार्यान्वयनों का पता है जो समय ओ (1) में दोनों संचालन प्रदान करते हैं O(1), इसलिए मैं ज्यादातर डेटा संरचना के आकार के बारे में चिंता करता हूं। मैं अरबों प्रविष्टियों की उम्मीद करता हूं लेकिन जितना संभव हो उतना स्वैपिंग से बचना चाहता हूं।

यदि आवश्यक हो तो मैं रनटाइम बलिदान करने के लिए तैयार हूं। O(logn) का प्रवर्धित रनटाइम वह है जिसे मैं स्वीकार कर सकता हूं; अपेक्षित रनटाइम या ω(logn) में रनटाइम स्वीकार्य नहीं हैं।

मेरे पास एक विचार यह है कि यदि S को श्रेणियों के संघ के रूप में दर्शाया जा सकता है [xmin, xmax], तो हम कुछ प्रदर्शन में कमी की कीमत के साथ भंडारण आकार को बचाने में सक्षम होंगे। इसके अलावा, कुछ अन्य डेटा पैटर्न संभव हैं, जैसे [0, 2, 4, 6]

क्या आप कृपया मुझे डेटा संरचनाओं की ओर संकेत कर सकते हैं जो ऐसा कुछ कर सकते हैं?



तत्वों की संख्या चित्र में कैसे प्रवेश करती है? यानी, यदि कोई तत्व डाला गया है और पहले से ही है तो क्या होगा ? nn
वॉनब्रांड ३०'१४

@vonbrand - nसेट के आकार का है। यह हर के साथ बढ़ सकता है insert, या यह वही रह सकता है यदि तत्व xपहले से ही सेट में है।
HEKTO

3
क्या आप झूठी सकारात्मकता की एक छोटी सी संभावना को स्वीकार कर सकते हैं? : यदि हां, तो एक तरह खिलने फिल्टर आदर्श हो सकता है en.wikipedia.org/wiki/Bloom_filter
जो

1
@AlekseyYakovlev, एक खिलने फिल्टर की झूठी सकारात्मक दर ब्रह्मांड का आकार (केवल हैश फंक्शन की संख्या के साथ कोई लेना देना नहीं है , डेटा संरचना के आकार , और मदों की संख्या ), लेकिन अगर वास्तव में है के पास (कहते हैं कि एक छोटे से लगातार के लिए ), तो आपको कठिन एक सरल सा वेक्टर मुझे लगता है कि तुलना में बेहतर करने के लिए, साथ ही दबाया हो जाएगा कुल बिट्स अंतरिक्ष की। kmnnuu=ncccn
जो

जवाबों:


8

जो का जवाब बेहद अच्छा है, और आपको सभी महत्वपूर्ण कीवर्ड देता है।

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

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

यदि आवेषण अधिक बार होते हैं, तो मैं सुझाव देता हूं कि हैशटैंग हैशिंग। मूल विचार यहाँ समझाने के लिए पर्याप्त सरल है, इसलिए मैं ऐसा करूँगा।

तो मूल जानकारी सिद्धांतात्मक परिणाम यह है कि यदि आप आइटम के एक ब्रह्मांड से तत्वों को संग्रहीत कर रहे हैं , और कोई अन्य जानकारी नहीं है (उदाहरण के तत्वों के बीच कोई संबंध नहीं है) तो आपको इसे स्टोर करने के लिए बिट्स। (सभी लघुगणक आधार -2 जब तक अन्यथा निर्दिष्ट कर रहे हैं।) आप की जरूरत है इस कितने बिट। इसके आसपास कोई रास्ता नहीं है।nulog(un)+O(1)

अब कुछ शब्दावली:

  • यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और आपके कार्यों को बिट्स स्पेस में सपोर्ट करती है, तो हम इसे एक अंतर्निहित डेटा संरचना कहते हैं।log(un)+O(1)
  • यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और आपके स्थान के बिट्स , हम इसे एक कॉम्पैक्ट डेटा संरचना कहते हैं। ध्यान दें कि व्यवहार में इसका मतलब है कि सापेक्ष ओवरहेड (सैद्धांतिक न्यूनतम के सापेक्ष) एक स्थिर के भीतर है। यह 5% ओवरहेड या 10% ओवरहेड या 10 गुना ओवरहेड हो सकता है।log(un)+O(log(un))=(1+O(1))log(un)
  • यदि आपके पास एक डेटा संरचना है, जो डेटा को संग्रहीत कर सकती है और में अपने संचालन का समर्थन करती है स्थान के बिट्स , हम इसे एक सक्सेसफुल डेटा स्ट्रक्चर कहते हैं।log(un)+o(log(un))=(1+o(1))log(un)

सक्सेस और कॉम्पैक्ट के बीच का अंतर थोड़ा-ओह और बड़ा-ओह के बीच का अंतर है। एक पल के लिए निरपेक्ष मूल्य की अनदेखी ...

  • g(n)=O(f(n)) अर्थ है कि एक निरंतर और संख्या ऐसा है जो सभी , ।cn0n>n0g(n)<cf(n)
  • g(n)=o(f(n)) अर्थ है कि सभी स्थिरांक लिए एक संख्या मौजूद है जैसे कि सभी , ।cn0n>n0g(n)<cf(n)

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

बेशक, समस्या का आकार आपके द्वारा इच्छित रिश्तेदार उपरि को महसूस करने के लिए बहुत बड़ा हो सकता है, लेकिन आपके पास सब कुछ नहीं हो सकता है।

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

एक लुकअप ऑपरेशन में -bit की हैश होगी , हैश स्लॉट्स को खोजने के लिए बिट्स से नकाब हटाएं , और फिर यह देखें कि टेबल की वैल्यू कुंजी से मेल खाती है या नहीं। अब तक सब ठीक है।nm

ऐसी हैश तालिका बिट का उपयोग करती है। क्या हम इससे बेहतर कर सकते हैं?n2m

मान लीजिए कि हैश फंक्शन उलटा है। फिर हमें प्रत्येक हैश स्लॉट में पूरी कुंजी संग्रहीत करने की आवश्यकता नहीं है। हैश स्लॉट का स्थान आपको हैश मान के बिट्स देता है , इसलिए यदि आप केवल शेष बिट्स संग्रहीत करते हैं , तो आप उन दो टुकड़ों की जानकारी (हैश स्लॉट स्थान और वहां संग्रहीत मूल्य) से कुंजी को फिर से संगठित कर सकते हैं। तो आपको केवल बिट्स स्टोरेज की आवश्यकता होगी।hmnm(nm)2m

यदि , साथ तुलना में छोटा है , तो स्टर्लिंग का अनुमान और थोड़ा अंकगणित (प्रमाण एक अभ्यास है!) से पता चलता है कि2m2n

(nm)2m=log(2n2m)+o(log(2n2m))

इसलिए यह डेटा संरचना सक्सेज है।

हालांकि, दो कैच हैं।

पहला कैच "अच्छा" उल्टे हैश फ़ंक्शन का निर्माण कर रहा है। सौभाग्य से, यह दिखने में जितना आसान है; क्रिप्टोग्राफ़र हर समय उल्टे कार्य करते हैं, केवल उन्हें "साइबर" कहते हैं। उदाहरण के लिए, आप Feistel नेटवर्क पर एक हैश फ़ंक्शन को आधार बना सकते हैं, जो कि गैर-इनवर्टेबल हैश फ़ंक्शन से एक इनवर्टेड हैश फ़ंक्शन का निर्माण करने का एक सीधा तरीका है।

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

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

ओह, आप वैन एम्ड बोआस पेड़ों को देखना चाहते हैं।

अधिक जानकारी

यदि कहीं आसपास , तो लगभग , इसलिए (एक बार फिर) यह मानकर कि मूल्यों के बीच कोई और संबंध नहीं है, आप मूल रूप से कोई भी नहीं कर सकते हैं थोड़ा वेक्टर से बेहतर है। आप ध्यान दें कि ऊपर दिया गया हैशिंग समाधान उस मामले को प्रभावी ढंग से कम करता है (आप एक हैश स्लॉट के अनुसार एक बिट भंडारण), लेकिन यह हैश फ़ंक्शन का उपयोग करने के बजाय कुंजी को पते के रूप में उपयोग करने के लिए सस्ता है।nu2log(un)u

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


नमस्ते, आपके उत्तर के दूसरे पैराग्राफ के लिए - मुझे उम्मीद है कि हर कॉल उसी तर्क के साथ insertकॉल के findसाथ होगी। इसलिए, यदि findरिटर्न मिलता है true, तो हम इसे छोड़ देते हैं insert। तो, findकॉल की आवृत्ति अधिक होती है , फिर कॉल की आवृत्ति insert, जब भी nपास हो जाती है u, तब insertकॉल बहुत दुर्लभ हो जाती हैं।
HEKTO

लेकिन आप को अंततः करीब होने की उम्मीद करते ? un
छद्म नाम

वास्तविक दुनिया में यह तब तक बढ़ रहा है जब तक कि यह यू तक नहीं पहुंच जाता है, हालांकि हम अनुमान नहीं लगा सकते हैं कि ऐसा होगा या नहीं। डेटा संरचना को किसी भीn <= u
HEKTO

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

5

ऐसा लगता है कि आप गतिशील सदस्यता समस्या के लिए एक संक्षिप्त डेटा संरचना चाहते हैं ।

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

सदस्यता समस्या वास्तव में है क्या आप अपने प्रश्न में वर्णन:

ब्रह्माण्ड के उपसमूह (आकार ) को संचालन के साथ आकार बनाए रखें:SnU={0,1,2,3,,u1}u

  • find(x)(जाँचता है कि क्या तत्वx सदस्य है )।S
  • insert(x)(x को एक तत्व जोड़ें )S
  • delete(x)(x से एक तत्व निकालें )S

यदि केवल findऑपरेशन समर्थित है, तो यह स्थैतिक सदस्यता समस्या है। यदि दोनों में से insertया deleteसमर्थन कर रहे हैं, लेकिन दोनों नहीं है, यह कहा जाता है अर्द्ध गतिशील , और यदि सभी तीन आपरेशनों का समर्थन कर रहे हैं, तो यह कहा जाता है गतिशील सदस्यता समस्या।

Techincally, मुझे लगता है कि आपने केवल अर्ध-गतिशील सदस्यता समस्या के लिए एक डेटा संरचना के लिए कहा था, लेकिन मुझे किसी भी डेटा संरचनाओं का पता नहीं है जो इस बाधा का लाभ उठाते हैं और आपकी अन्य आवश्यकताओं को भी पूरा करते हैं। हालाँकि, मेरे पास निम्नलिखित संदर्भ हैं:

निरंतर समय और लगभग न्यूनतम स्थान में लेख सदस्यता के प्रमेय 5.1 में , ब्रोडनिक और मुनरो निम्नलिखित परिणाम देते हैं:

बिट्स की आवश्यकता के लिए एक डेटा संरचना मौजूद है जो निरंतर समय में खोजों और निरंतर अपेक्षित परिशोधन समय में सम्मिलन और विलोपन का समर्थन करती है।O(B)

जहाँ आवश्यक बिट्स की सूचना सिद्धांत न्यूनतम संख्या है।B=log(un)

मूल विचार यह है कि वे ब्रह्मांड को ध्यान से चुने गए आकारों की श्रेणियों में विभाजित करते हैं, इसलिए यह भी लगता है कि तकनीक उन पंक्तियों के साथ हो सकती है जिनके बारे में आप सोच रहे हैं।

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


1
ब्रोडनिक और मुनरो पेपर सार आवेषण के बारे में कुछ नहीं कहते हैं। लेकिन उनका नतीजा वही है जिसकी हम उम्मीद कर सकते हैं, है ना? यदि n = u/2, तो आवश्यक स्थान अधिकतम है।
HEKTO

@AlekseyYakovlev वे वास्तव में सार में गतिशील मामले का उल्लेख नहीं करते हैं, लेकिन गतिशील मामले से संबंधित प्रमेय मेरे उत्तर (धारा 5 से) में उद्धृत किया गया है।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.