इस उत्तर को लिखने के बाद, मुझे शायद प्रश्न को "बहुत व्यापक" के रूप में चिह्नित करना चाहिए - हम विभिन्न रणनीतियों के बारे में उम्र के लिए बात कर सकते हैं, अंत में आपके डेटा के साथ एक बेंचमार्क चलाना होगा।
प्रत्येक टैग को पूर्णांक द्वारा कुशलता से दर्शाया जा सकता है। प्रत्येक इकाई में टैग का एक सेट होता है। सही सेट कार्यान्वयन चुनना महत्वपूर्ण है - बी-पेड़ और सॉर्ट किए गए दोनों सरणियां संभव हैं। इस सेट के साथ, हम केवल सदस्यता परीक्षण करेंगे। जैसा कि दोनों संरचनाएं इसमें करती हैं ओ (लॉग टी) ( प्रति यूनिट टी टैग के साथ ) में ऐसा करती हैं, मैं उनके सघन प्रतिनिधित्व के कारण सरणियों को पसंद करूंगा।
अब हम एक ओ (n · लॉग टी · पी) में सभी संस्थाओं के माध्यम से फ़िल्टर कर सकते हैं ऑपरेशन , जहां पी विधेय निर्णय पेड़ में औसत पथ लंबाई है। इस निर्णय वृक्ष को आदेश दिया जा सकता है ताकि किसी निर्णय पर जल्दी पहुंचा जा सके। सांख्यिकीय आंकड़ों के बिना, केवल सामान्य सब-डेप्रिसिएशन को फैक्टर करना संभव है।
जिस क्रम में संस्थाओं की खोज की जाती है वह वास्तव में महत्वपूर्ण नहीं है। दूसरी तरफ इसे छाँटना फायदेमंद हो सकता है, 0
ताकि i
सभी सूचकांकों में इकाइयाँ एक निश्चित टैग के साथ हों, जबकि बाकी नहीं। इस विशिष्ट टैग की खोज करते समय यह n कम कर देता है (निर्णय ट्री में, यह पहला परीक्षण होना चाहिए)। इसे कई स्तरों पर विस्तारित किया जा सकता है, लेकिन यह चीजों को जटिल बनाता है और O (2) लेता है कश्मीर ) के साथ स्मृति कश्मीरस्तरों। कई स्तरों के साथ, सबसे अधिक लाभ वाले टैग को पहले तय किया जाना चाहिए, जहां लाभ उन संस्थाओं की संख्या है जिन्हें उन्हें त्यागने की संभावना से कई गुना अधिक नहीं देखा जाना चाहिए। लाभ 50:50 अवसरों के लिए अधिकतम हो जाता है या जब 50% संस्थाओं में यह विशिष्ट टैग होता है। यदि आप एक्सेस पैटर्न के बारे में नहीं जानते हैं तो भी यह आपको ऑप्टिमाइज़ करने की अनुमति देगा।
आप उपयोग किए गए प्रत्येक टैग द्वारा इकाइयां सेट करने वाली इकाइयाँ भी बना सकते हैं - T1
अगले के लिए सभी संस्थाओं के साथ एक सेट T2
। एक स्पष्ट (स्थान और समय) अनुकूलन को रोकना है जब एक सेट में सभी तत्वों में से आधे से अधिक होता है, और उन तत्वों को सहेजने के लिए जिनके पास यह टैग नहीं है - इस तरह, सभी टैग के लिए सूचक बनाना ½ · n · t
अंतरिक्ष से कम लगेगा (साथ टी कुल में टैग)। ध्यान दें कि पूरक सेट को बचाने से अन्य अनुकूलन अधिक कठिन हो सकते हैं। फिर से, मैं सेट के लिए (सॉर्ट किए गए) एरेज़ दूंगा।
यदि आप एक पूर्णांक सीमा के माध्यम से अपनी संस्थाओं का प्रतिनिधित्व करते हैं, तो आप केवल एक निरंतर सीमा के प्रारंभ और समाप्ति सदस्य को संग्रहीत करके सूचकांक सेट के लिए उपयोग किए जाने वाले स्थान को संपीड़ित कर सकते हैं। कार्यान्वयन-वार यह संभवतः यह इंगित करने के लिए एक उच्च सीमा के साथ किया जाएगा कि क्या कोई प्रविष्टि एक सीमाबद्ध या नियमित प्रविष्टि है।
यदि हमारे पास अब इंडेक्स सेट (और इस प्रकार टैग पर आँकड़े) हैं, तो हम अपनी विधेयकों को अनुकूलित कर सकते हैं ताकि पहले संभावित गुणों का परीक्षण न हो (विफल-तेज रणनीति)। इसका मतलब यह है कि यदि T1
आम है और T2
दुर्लभ है, तो T1 & T2
सभी T2
सूचकांक सेट प्रविष्टियों के माध्यम से पुनरावृत्ति करके और इसके तत्व के लिए परीक्षण करके विधेय का मूल्यांकन किया जाना चाहिए T1
।
यदि हम अनुक्रम सेट को लागू करने के लिए सॉर्ट किए गए सरणियों का उपयोग करते हैं, तो विलय के संचालन के रूप में कई मूल्यांकन चरणों को लागू किया जा सकता है। T1 & T2
इसका मतलब है कि हम T1
और T2
सूचियों को लेते हैं , एक लक्ष्य सरणी को बड़े इनपुट के आकार को आवंटित करते हैं और निम्नलिखित एल्गोरिथ्म को तब तक निष्पादित करते हैं जब तक कि दोनों इनपुट खाली न हों: यदि T1[0] < T2[0]
, तब T1++
(सिर को त्यागें)। अगर है T1[0] > T2[0]
तो T2++
। दोनों सिरों पर बराबर हैं, तो लक्ष्य सरणी के लिए खत्म हो उस नंबर की प्रतिलिपि बनाएँ, और सभी तीन संकेत (बढ़ा देते T1
, T2
, लक्ष्य)। यदि विधेय है T1 | T2
, तो कोई भी तत्व खारिज नहीं किया जाता है , लेकिन छोटे की नकल की जाती है। फॉर्म की एक विधेय को T1 & ¬T2
एक विलय की रणनीति का उपयोग करके भी लागू किया जा सकता है, लेकिन ¬T1
या T1 | ¬T2
नहीं।
विधेय निर्णय वृक्ष को आदेश देते समय इस पर विचार किया जाना चाहिए: पूर्णताएं या तो आरएचएस पर होनी चाहिए &
, या अंत में, जब अंतिम गणना निर्धारित की जा रही है और वास्तविक तत्वों को देखने की जरूरत नहीं है।
इंडेक्स सेट का उपयोग किए बिना, प्रत्येक थ्रेड संस्थाओं के अपने हिस्से के माध्यम से फ़िल्टर कर सकता है और उन तत्वों की गिनती को लौटा सकता है जो कि विधेय से मेल खाते हैं, जिन्हें अभिव्यक्त किया जा सकता है। इंडेक्स सेट का उपयोग करते समय, फिर प्रत्येक धागे को निर्णय के पेड़ में एक नोड सौंपा जाएगा। यह दो इनपुट स्ट्रीम लेता है जो ऑर्डर किए गए सेट के अनुरूप होता है, और एक मर्ज किए गए स्ट्रीम को वापस करता है। ध्यान दें कि निर्णय वृक्ष में प्रत्येक नोड में एक समान सेट होता है जो सभी संस्थाओं का प्रतिनिधित्व करता है जो उस उप-अभिव्यक्ति को पूरा करते हैं, और यह कि सेट के आदेश के कारण, उन्हें विलय करने के लिए पूरे सेट को एक बार में जानना आवश्यक नहीं है। ।
अनुक्रमित सेटों को मर्ज करने या संस्थाओं की एक सूची के माध्यम से फ़िल्टर करने जैसी विभिन्न रणनीतियों को एक निश्चित डिग्री तक जोड़ा जा सकता है। फ़िल्टरिंग में बहुत ही पूर्वानुमानित प्रदर्शन होता है। यदि कोई क्वेरी बहुत विशिष्ट है ताकि इंडेक्स सेट का उपयोग खोज स्थान को काफी कम कर दे, तो मर्ज संचालन बेहतर हो सकता है। यह ध्यान रखना महत्वपूर्ण है कि कई बड़े इनपुट सेट को मर्ज करने से ब्रूट-बल खोज की तुलना में बहुत खराब प्रदर्शन हो सकता है। एक बहुत ही अनुकूलित एल्गोरिथ्म इनपुट आकार, क्वेरी संरचना और सांख्यिकीय संकेतकों के आधार पर एक उपयुक्त रणनीति चुनेगा।
एक तरफ के रूप में, आंशिक परिणामों को कैशिंग करना फायदेमंद हो सकता है यदि यह उम्मीद की जाती है कि भविष्य में भी इसी तरह के प्रश्न चलेंगे, भले ही वे इनबिल्ट रन को गति न दें।
T1
के लिए एक ही वस्तु संदर्भE1
,E2
, आदि?