2008-12-19 16 views
5

से संबंधित है यदि मेरे पास निरंतर श्रेणियों का एक बड़ा सेट है (उदाहरण के लिए [0..5], [10..20], [7..13], [- 1। .37]) और उन सेटों को किसी भी डेटा-स्ट्रक्चर में व्यवस्थित कर सकते हैं, का परीक्षण करने का सबसे प्रभावी तरीका क्या है एक विशेष test_number से संबंधित है?_vhich_ सेट करने के लिए कुशल एल्गोरिदम

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

मुझे लगता है कि यह समस्या ग्राफिक्स प्रोसेसिंग में हल हो गई है क्योंकि उन्होंने कुशलतापूर्वक परीक्षण करने के तरीकों का पता लगाया है कि उनके बहु मॉडल में कौन से बहुभुज योगदान करते हैं एक विशिष्ट पिक्सेल के लिए, लेकिन मुझे उस प्रकार के एल्गोरिदम की शब्दावली नहीं पता है।

उत्तर

5

ग्राफिक्स में आपकी समस्या की प्रासंगिकता के बारे में आपकी अंतर्ज्ञान सही है। segment tree के निर्माण और पूछताछ पर विचार करें। यह आपकी गिनती क्वेरी के लिए विशेष रूप से उपयुक्त है। इसके description in Computational Geometry भी देखें।

+0

एक सेगमेंट पेड़ बस सेट की संख्या को गिनने का सबसे तेज़ तरीका नहीं है। चूंकि इसे ओ (एम। (लॉग (एन) + के) की आवश्यकता होगी) जहां एम चेक की संख्या है, और के सेटों की संख्या है, एन सेट की कुल संख्या है। मेरा एल्गोरिदम ओ (एम.एल.एल. (एन)) –

+0

मेहदाद है, आपका विचार उचित डेटा सेट के लिए नामुमकिन है। लेकिन सेगमेंट पेड़ काफी अधिक लचीला है। यह युगल को संभाल सकता है जबकि आपका पूर्णांक तक सीमित है। और यह आसानी से विशाल श्रेणियों को संभालेगा (कहें [0..2000000000] जो आपको अंतरिक्ष और समय का एक बड़ा हॉग बना देगा। – Sol

+0

यदि आप केवल गिनने में रुचि रखते हैं, तो आप केवल सेगमेंट पेड़ में सेट की संख्या स्टोर करते हैं, और तो गिनती को पुनः प्राप्त करने की लागत ओ (एन लॉग एन) बन जाती है। –

-1

मुझे लगता है कि मैं उन्हें मीडियाविकि इंडेक्स पेजों के समान तरीके से व्यवस्थित करता हूं - bucket sort के रूप में। मुझे नहीं पता कि यह वहां सबसे कुशल एल्गोरिदम है, लेकिन यह तेज़ होना चाहिए, और इसे कार्यान्वित करना बहुत आसान है (यहां तक ​​कि मैंने इसे प्रबंधित किया है, और उस पर एसक्यूएल में !!)।

असल में, छंटाई के लिए एल्गोरिथ्म

For Each SetOfNumbers 
    For Each NumberInSet 
     Put SetOfNumbers into Bin(NumberInSet) 

फिर क्वेरी करने के लिए, तो आप सिर्फ बिन (MyNumber) में आइटम की संख्या की गणना कर सकते हैं

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

ध्यान दें कि एल्गोरिदम में मैंने रेंज को सेट्सऑफनबर्स में विस्तारित किया है - किसी दिए गए श्रेणी में प्रत्येक नंबर का आकलन किया है।

+0

मुझे लगता है कि बाल्टी सॉर्ट यहां अप्रासंगिक है। बाल्टी प्रकार में, बाल्टी में कोई चौराहे नहीं है। यहां, हमारे सेट में छेड़छाड़ है। –

+0

मुझे नहीं लगता कि मैं आपका अनुसरण करता हूं। मेरे एल्गोरिदम में मैं सीमा सीमाओं की बजाय सीमा में सभी संख्याओं को शामिल करने के लिए संख्याओं के सेट का विस्तार कर रहा हूं। यह बहुत अक्षम है, लेकिन बहुत समय कुशल है। बाल्टी के बीच चौराहे प्रासंगिक नहीं हैं। –

1

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

   Set1 
      /| \ 
      / | \ 
      / | \ 
     Set2 Set3 Set4 

यह त्वरित और वहाँ सेटों में ओवरलैप है कि अगर यह बताने के लिए है, क्योंकि आप केवल उन्हें ऑर्डर करने के लिए न्यूनतम और अधिकतम मानों की तुलना करने के लिए है आसान है। ऊपर दिए गए साधारण मामले में, सेट 2 [अधिकतम] < सेट 1 [मिनट], सेट 4 [मिनट]> सेट 1 [अधिकतम], और सेट 1 और सेट 3 में कुछ ओवरलैप है।इससे आपकी खोज तेज हो जाएगी क्योंकि यदि आप जिस नंबर की खोज कर रहे हैं वह Set1 में है, तो यह Set2 या Set4 में नहीं होगा, और आपको उन्हें जांचना नहीं है।

मैं सिर्फ यह इंगित करना चाहता हूं कि इस तरह की एक योजना का उपयोग केवल आपके सेट की तुलना में जांचने के लिए अधिक संख्या वाले प्रत्येक सेट की जांच के निष्पक्ष कार्यान्वयन पर समय बचाता है।

संबंधित मुद्दे