क्या आप चाहते हैं एक अच्छा selection algorithm
निम्नलिखित अजगर कोड समारोह partition()
विभाजन के आसपास आधारित है है दो भागों में सूची बांट देता है। "पिवोटवेल्यू" से कम मान सूची की शुरुआत में स्थानांतरित हो जाते हैं। PivotValue से अधिक मान सूची के अंत में ले जाया जाता है। यह ओ (एन) संचालन में प्रारंभ से अंत तक सूची के माध्यम से किया जाता है, प्रत्येक बार जब यह एक मूल्य को देखता है तो यह सूची की शुरुआत के करीब ले जाता है, केवल तभी जब यह पिवट मूल्य से छोटा होता है।
(अपने मामले में नोट करें कि हम वास्तव में बड़े मूल्यों को सूची की शुरुआत में ले जाते हैं क्योंकि आप सबसे छोटे मूल्यों को सबसे छोटे नहीं चाहते हैं)।
एक बार जब हमने ओ (एन) समय में सूची विभाजित की है, तो हमें सूची की शुरुआत में बड़ी संख्या में छोड़ दिया गया है। यदि एम = 10 तो महान है, तो यह आपकी दस सबसे बड़ी संख्या है। यदि मीटर 10 से बड़ा है, तो हमें सबसे बड़ी संख्या में सबसे बड़ी संख्या प्राप्त करने के लिए फिर से सबसे बड़ी संख्याओं को विभाजित करने की आवश्यकता है। यदि मीटर 10 से छोटा है तो हमें 10-मीटर अधिक संख्या की आवश्यकता है, इसलिए हम 10-मीटर संख्याओं को खोजने के लिए राइडर पार्टियन को विभाजित करते हैं और हमें आवश्यक संख्याओं को प्राप्त करने के लिए हमारे एम नंबरों में जोड़ते हैं।
इसलिए हम विभाजन करते रहते हैं जब तक कि हमारे पास 10 सबसे बड़ी संख्या न हो। यह select()
विधि द्वारा किया जाता है। पूरी विधि आमतौर पर बहुत तेज़ होती है क्योंकि हर बार जब हम विभाजन करते हैं तो हमें सौदा करने के लिए लगभग आधा संख्या छोड़ दी जाती है। (यदि आप लगातार दो संख्याओं को देखने के लिए आवश्यक संख्याओं की संख्या को विभाजित करते हैं, तो यह अच्छा है)। प्रत्येक बार जब हम एक विभाजन करते हैं जो 10 से अधिक बड़ी संख्या में पैदा करता है, तो हम बहुत कम संख्याओं के पूरे ढेर को अनदेखा करते हैं।
def partition(_list,left,right,pivotIndex):
pivotValue=_list[pivotIndex]
_list[right],_list[pivotIndex]=pivotValue,_list[right]
storeIndex=left
for i in range(left,right):
if _list[i] > pivotValue:
_list[storeIndex],_list[i]=_list[i],_list[storeIndex]
storeIndex+=1
_list[right],_list[storeIndex]=_list[storeIndex],_list[right]
return storeIndex
from random import randint
def select(_list,left,right,k):
if left==right:
return _list[:left+1]
pivotIndex=randint(left,right)
pivotNewIndex=partition(_list,left,right,pivotIndex)
pivotDist=pivotNewIndex-left+1
if pivotDist==k:
return _list[:pivotNewIndex+1]
elif k<pivotDist:
return select(_list,left,pivotNewIndex-1,k)
else:
return select(_list,pivotNewIndex+1,right,k-pivotDist)
_list=[1,2,109,2234,23,6,1,234,11,4,12451,1]
left=0
right=len(_list)-1
pivotIndex=4
print _list
"[1, 2, 109, 2234, 23, 6, 1, 234, 11, 4, 12451, 1]"
print partition(_list,left,right,pivotIndex) #partition is order(N).
"7" #index 7, so the lowest number are in the first 7 numbers of the list [1, 2, 1, 6, 1, 11, 4, 23]
print _list
"[1, 2, 1, 6, 1, 11, 4, 23, 2234, 109, 12451, 234]"
print select(_list,left,right,10)
"[1, 2, 1, 1, 4, 11, 6, 23, 109, 234]"
with open('nums.txt') as f:
numbers=map(int,f.readlines())
print select(numbers,0,len(numbers)-1,10)
"[1132513251, 2000, 23512, 13252365, 1235, 1251, 324, 100, 82, 82]"
इस होमवर्क है:
यहाँ कोड है? या एक किताब से एक अभ्यास? – ChrisW
यह होमवर्क है .. –
यह स्पष्ट रूप से एक [एक्सवाई समस्या] (http://www.perlmonks.org/?node_id=542341) है। समस्या सॉर्ट नहीं कर रही है, लेकिन दस सबसे बड़े पूर्णांक ढूंढना। जबकि वे पहले क्रमबद्ध करके और फिर शीर्ष दस प्रविष्टियों को चुनकर पाए जा सकते हैं, यह सबसे अच्छा समाधान नहीं है। सबसे अच्छा समाधान _pepsi_ द्वारा प्रदान किया गया एक है। – pillmuncher