आप वास्तव में समय ओ (एन) और स्पेस ओ (के) में ऐसा कर सकते हैं, जहां के बहुत ही चालाक चाल का उपयोग करके आप निकटतम बिंदुओं की संख्या है।
selection problem इस प्रकार है: तत्वों की एक सरणी और कुछ सूचकांक मैं, सरणी के तत्वों को पुनर्व्यवस्थित को देखते हुए ऐसी है कि ith तत्व सही जगह में है, सभी तत्वों के ith तत्व की तुलना में छोटे बाईं ओर हैं , और ith तत्व से अधिक सभी तत्व दाईं ओर हैं। उदाहरण के लिए, अगर मैं सूचकांक 2 (शून्य अनुक्रमित) के आधार पर चयन करने की कोशिश की सरणी
40 10 00 30 20
को देखते हुए एक परिणाम हो सकता है
10 00 20 40 30
सूचकांक 2 (20) पर तत्व के बाद से में है सही जगह, बाईं ओर के तत्व 20 से छोटे होते हैं, और दाएं तत्व 20 से अधिक होते हैं।
यह पता चला है कि चूंकि यह वास्तव में सरणी को सॉर्ट करने की तुलना में कम सख्त आवश्यकता है, इसलिए ऐसा करना संभव है यह समय में ओ (एन), जहां एन सरणी के तत्वों की संख्या है। ऐसा करने के लिए median-of-medians एल्गोरिदम जैसे कुछ जटिल एल्गोरिदम की आवश्यकता होती है, लेकिन वास्तव में ओ (एन) समय है।
तो आप इसका उपयोग कैसे करते हैं? एक विकल्प फ़ाइल से सभी एन तत्वों को एक सरणी में लोड करना है, फिर ओ (एन) समय और ओ (एन) स्पेस (यहां, के = 100) में शीर्ष के चयन के लिए चयन एल्गोरिदम का उपयोग करें।
लेकिन आप वास्तव में इससे बेहतर कर सकते हैं! किसी भी स्थिर के लिए जो आप चाहते हैं, 2k तत्वों का बफर बनाए रखें। फ़ाइल से सरणी में 2k तत्व लोड करें, फिर इसे पुनर्व्यवस्थित करने के लिए चयन एल्गोरिदम का उपयोग करें ताकि छोटे के तत्व सरणी के बाएं आधे भाग में हों और सबसे बड़ा दाएं हो, फिर सबसे बड़े के तत्वों को छोड़ दें (वे ' के निकटतम बिंदुओं में से कोई भी नहीं)। अब, फ़ाइल से अधिक तत्वों को बफर में लोड करें और फिर से यह चयन करें, और जब तक आप फ़ाइल की प्रत्येक पंक्ति को संसाधित नहीं करते हैं तब तक इसे दोहराएं। प्रत्येक बार जब आप चयन करते हैं तो आप बफर में सबसे बड़े के तत्वों को त्याग देते हैं और अब तक के सबसे नज़दीकी बिंदुओं को बनाए रखते हैं। नतीजतन, अंत में, आप पिछली बार शीर्ष के तत्वों का चयन कर सकते हैं और शीर्ष के को ढूंढ सकते हैं।
नए दृष्टिकोण की जटिलता क्या है? खैर, आप बफर और चयन एल्गोरिदम के लिए ओ (के) मेमोरी का उपयोग कर रहे हैं। आप आकार ओ (के) के कुल बफर (ओ) के बफर पर कॉलिंग का चयन करते हैं, क्योंकि आप नए तत्वों को पढ़ने के बाद चयन करते हैं।चूंकि आकार ओ (के) के बफर पर चयन करने के समय ओ (के) लगता है, यहां कुल रनटाइम ओ (एन + के) है। यदि के = ओ (एन) (एक उचित धारणा), इसमें समय ओ (एन), स्पेस ओ (के) लगता है।
आशा है कि इससे मदद मिलती है!
संभावित डुप्लिकेट [लंबाई एन की सूची में एक्स सबसे छोटे पूर्णांक खोजें] (http://stackoverflow.com/questions/3764355/find-the-x-smallest-integers-in-a-list-of- लंबाई-एन) – hugomg
हां, करुणा। यह एक दिलचस्प सवाल है, लेकिन पहले से ही इसका उत्तर दिया गया है। –
@missingno: यह समान प्रकार का है लेकिन उस प्रश्न को आसानी से समाधान द्वारा हल किया जा सकता है जिसे मैंने ऊपर प्रदान किया है। यहां, कुछ अतिरिक्त गणना की आवश्यकता है और मैं जानना चाहता था कि उन्हें कम करने का कोई तरीका है या नहीं। – noMAD