पूर्णांक तत्व:
अपने तत्वों के प्रकार पूर्णांक हैं, तो सबसे अच्छा तरीका है प्रत्येक संख्या के लिए अपने उप पर्वतमाला है, जहां प्रत्येक बाल्टी गिनती के लिए प्रयोग किया जाता है में से किसी में निहित एक बाल्टी के लिए है आपके इनपुट तत्वों में इसके संबंधित पूर्णांक की संख्या (उदाहरण के लिए, bucket[100]
स्टोर करता है कि आपके इनपुट अनुक्रम में कितने 100
एस हैं)। असल में आप इसे निम्न चरणों में प्राप्त कर सकते हैं:
- प्रत्येक संख्या के लिए बाल्टी बनाएं आपकी उप-श्रेणियों में से किसी एक में है।
- प्रत्येक संख्या
n
के लिए सभी तत्वों के माध्यम से पुनरावृत्त करें, यदि हमारे पास bucket[n]
है, तो bucket[n]++
।
- अपनी बाल्टी में संग्रहीत समेकित मूल्यों के आधार पर मध्यस्थों की गणना करें।
इसे एक और तरीके से रखें, मान लीजिए कि आपके पास उप-श्रेणी [0, 10]
है, और आप औसत गणना करना चाहते हैं। बाल्टी दृष्टिकोण मूल रूप से गणना करता है कि आपके इनपुट में कितने 0
एस हैं, और आपके इनपुट में कितने 1
एस हैं और इसी तरह। मान लीजिए n
संख्या रेंज [0, 10]
में झूठ है, तो मंझला n/2
वां सबसे बड़ा तत्व है, जो खोजने i
ऐसी है कि या इसके बराबर bucket[0] + bucket[1] ... + bucket[i]
अधिक से अधिक n/2
लेकिन bucket[0] + ... + bucket[i - 1]
n/2
से कम है से पहचाना जा सकता है।
इस बारे में अच्छी बात यह है कि आपके इनपुट तत्व भी कई मशीनों (यानी वितरित मामले) में संग्रहीत होते हैं, प्रत्येक मशीन अपनी बाल्टी बनाए रख सकती है और इंट्रानेट से गुजरने के लिए केवल समेकित मूल्यों की आवश्यकता होती है।
आप पदानुक्रमित बाल्टी का भी उपयोग कर सकते हैं, जिसमें एकाधिक पास शामिल हैं। प्रत्येक पास में, bucket[i]
आपके इनपुट में तत्वों की संख्या को एक विशिष्ट सीमा में निहित करता है (उदाहरण के लिए, [i * 2^K, (i+1) * 2^K]
), और फिर प्रत्येक चरण के बाद मध्यम बाल्टी को पहचानने के द्वारा समस्या स्थान को सीमित कर दें, फिर K
1
में घटाएं अगला कदम, और तब तक दोहराएं जब तक कि आप माध्यम को सही ढंग से पहचान सकें।
फ्लोटिंग प्वाइंट तत्व
पूरे तत्वों स्मृति में फिट कर सकते हैं:
अपने पूरे तत्वों स्मृति में फिट कर सकते हैं, पहले एन तत्व छँटाई और फिर खोजने माध्यिकाओं प्रत्येक उप श्रेणियों के लिए सबसे अच्छा विकल्प है। The linear time heap solution इस मामले में भी अच्छी तरह से काम करता है यदि आपकी उप-श्रेणियों की संख्या logN
से कम है।
पूरे तत्वों स्मृति में फिट नहीं कर सकते, लेकिन एक ही मशीन में संग्रहीत:
आम तौर पर, एक external sort आम तौर पर तीन डिस्क स्कैन की आवश्यकता है। इसलिए, यदि आपकी उप-श्रेणियों की संख्या 3 से अधिक या बराबर है, तो पहले एन तत्वों को क्रमबद्ध करें और फिर डिस्क से आवश्यक तत्वों को लोड करके केवल प्रत्येक उप श्रेणियों के लिए औसत ढूंढना सर्वोत्तम विकल्प है। अन्यथा, बस प्रत्येक उप-श्रेणियों के लिए स्कैन करना और उप-श्रेणी में उन तत्वों को चुनना बेहतर है।
पूरे तत्वों कई मशीनों में जमा हो जाती है: मंझला खोजने के बाद से, एक समग्र ऑपरेटर है जिसका अर्थ है आप पूरे इनपुट के कई हिस्सों की माध्यिकाओं के आधार पर इनपुट के अंतिम मंझला प्राप्त नहीं सकता, यह एक कठिन समस्या है कि कोई भी कुछ वाक्यों में अपने समाधान का वर्णन नहीं कर सकता है, लेकिन शोध हैं (उदाहरण के रूप में this देखें) इस समस्या पर ध्यान केंद्रित किया गया है।
यदि सूची क्रमबद्ध है, तो केवल तत्व संख्या 50, 112, 700, आदि प्राप्त करें? – Blorgbeard
एक चयन एल्गोरिदम का उपयोग करें (http://en.wikipedia.org/wiki/Selection_algorithm) ... जिनमें से कई चुनने के लिए हैं। – andand
सूची क्रमबद्ध नहीं है। और मैं ज्यादातर श्रेणियों को ओवरलैप करने में मध्यस्थों को खोजने में डुप्लिकेट काम से बचने में रूचि रखता हूं। – dabei