5

होने के रूप में एक आइटम को परिभाषित करें:अधिकतम क्लस्टर का न्यूनतम मूल्य ढूँढना?

  • में एक विशिष्ट आईडी
  • एक मूल्य
  • एक रचना समय
  • हटाने समय

मैं दो इनपुट धाराओं है - एक है कि मुझे सूचित जब कोई आइटम बनाया जाता है, तो वह आइटम जो मुझे हटा देता है जब आइटम हटा दिया जाता है। एक आइटम को कॉल करें जिसे बनाया गया है लेकिन "जीवित" नष्ट नहीं हुआ है।

मैं एक ढेर का उपयोग कर सभी जीवित आइटम के अधिकतम मूल्य ट्रैक कर सकते हैं:

whenCreated(item): 
    i = heap.size 
    heap-up(item, heap.size) 
    heap.size = heap.size + 1 
    max-value = heap[0] 

whenDeleted(item): 
    ktem = heap[heap.size - 1] 
    heap.size = heap.size - 1 
    heap-up(ktem, index[item.id]) 
    heap-down(ktem, index[ktem.id]) 
    max-value = heap[0] 

heap-up(item, i): 
    while (i > 0): 
    j = floor((i-1)/2) 
    jtem = heap[j] 
    if (jtem.value > item.value): 
     break while 
    index[jtem.id] = i 
    heap[i] = heap[i] 
    i = j 
    index[item.id] = i 
    heap[i] = item 

heap-down(item, i): 
    while (2*i + 1 < heap.size): 
    if (2*i + 1 == heap.size or heap[2*i+1].value > heap[2*i+2].value): 
     j = 2*i + 1 
    else 
     j = 2*i + 2   
    jtem = heap[j] 
    if (jtem.value < item.value): 
     break while 
    index[jtem.id] = i 
    heap[i] = heap[i] 
    i = j   
    index[item.id] = i 
    heap[i] = item 

मैं n आइटम मिल गया है, तो जोड़ना या हटाना एक O(log n) समय लगता है।

अब मान लीजिए कि आइटम ऐसी है कि दो आइटम, a और b, |a.value - b.value| < deltaa और b एक ही क्लस्टर में हैं दी गुच्छा बनाती हैं।

उदाहरण के लिए, अगर हम मान (1, 2, 3, 4, 7, 8, 11, 13, 14, 15, 16) और delta = 2 मिल गया है, तो समूहों (1, 2, 3, 4), (7, 8), (11), और (13, 14, 15, 16) हैं।

मैं क्लस्टर के न्यूनतम मान को ट्रैक करना चाहता हूं जिसमें अधिकतम रहने का मूल्य शामिल है। मैं इसे ढेर से मूल्यों को पढ़ने के द्वारा कर सकता हूं जब तक कि मुझे delta के बराबर आकार के मानों के बीच कोई अंतर न मिल जाए। हालांकि, यह O(n) समय लेता है, जो अपेक्षाकृत अक्षम लगता है।

क्या उस क्लस्टर के न्यूनतम मूल्य को ट्रैक करने के लिए O(log n) एल्गोरिदम है?

+0

क्लस्टर ट्रांसमिटिव हैं? उदाहरण के लिए, यदि डेल्टा 2 है, तो एक ही क्लस्टर में 1, 2, 3, 4, 5, और 6 सभी हैं? – templatetypedef

+0

मुझे संदेह है कि आप इसे केवल अपने वर्तमान ढेर के साथ कर सकते हैं। ऐसा लगता है कि इसे कुशलतापूर्वक करने के लिए आपको एक अलग डेटा संरचना की आवश्यकता होगी। एक अपमानजनक सेट अच्छा होगा, हालांकि आपके क्लस्टर मर्ज कर सकते हैं और फिर अनमर्ज कर सकते हैं, इसलिए आपको कुछ ऐसी चीज चाहिए जो अलगाव (जो संघ-खोज नहीं करता), उर्फ ​​विभाजन परिष्करण की अनुमति देता है। – davin

+0

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

उत्तर

0

आप ढेर के बजाय बाइनरी पेड़ (या इसके रूपों) का उपयोग कर सकते हैं। एक मान और न्यूनतम मान ढूँढना ओ (लॉग इन) दोनों में हैं। प्रत्येक क्लस्टर के लिए अलग बाइनरी पेड़ का निर्माण करें।

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

+0

मुझे यकीन नहीं है कि मैं देखता हूं कि क्लस्टरिंग में कारक होने पर यह कैसे मदद करता है। आप एक ही क्लस्टर में दो नोड्स कुशलता से निर्धारित कैसे करेंगे? – templatetypedef

+0

यदि आपको दो क्लस्टर मर्ज करने की आवश्यकता है तो क्या होता है? या दो में एक क्लस्टर विभाजित? – templatetypedef

+0

@templatetypedef प्रत्येक क्लस्टर के लिए अलग पेड़ बनाएं। – ElKamina

4

मेरा मानना ​​है कि आप प्रत्येक ऑपरेशन के लिए ओ (लॉग एन) अमूर्त समय की गारंटी के लिए स्प्ले पेड़ों के संतुलित बाइनरी खोज पेड़ का उपयोग करके ऐसा कर सकते हैं।

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

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

अधिकतम क्लस्टर के न्यूनतम मान को खोजने के लिए, ओ (लॉग एन) समय में बीएसटी में अधिकतम क्लस्टर पाएं, फिर क्लस्टर के न्यूनतम तत्व को आप अमूर्त ओ (लॉग एन) समय में पाएं।

तत्व को हटाने के लिए, उस क्लस्टर को ढूंढें जिसमें यह O (लॉग n) समय है। यदि यह अपने क्लस्टर में है, तो उस क्लस्टर फ्रॉम को पेड़ हटा दें। यदि नहीं, तो क्लस्टर से तत्व को हटा दें, फिर उस क्लस्टर के भीतर अपने पूर्ववर्ती और उत्तराधिकारी को ढूंढें। यदि वे एक दूसरे के डेल्टा के भीतर हैं, तो क्लस्टर अभी भी ठीक है और हम कर रहे हैं। अन्यथा, क्लस्टर विभाजित किया जाना चाहिए। ओ (लॉग एन) में अमूर्त समय में, क्लस्टर को पूर्ववर्ती से कम या उसके बराबर नोड्स के समूह में विभाजित करें और उत्तराधिकारी के बराबर या बराबर, फिर दोनों क्लस्टर को पेड़ में दोबारा डालें।

कुल मिलाकर, यह प्रत्येक ऑपरेशन के लिए ओ (लॉग एन) को आवंटित करता है।

आशा है कि इससे मदद मिलती है!

+0

मैं स्प्ले पेड़ पर एक नज़र डालेगा, धन्यवाद! – rampion