समय में अनियोजित सरणी के माध्यिका का पता लगाएं


45

एक अनियोजित सरणी के माध्यिका को खोजने के लिए, हम तत्वों के लिए समय में एक मिन-हीप बना सकते हैं , और फिर हम माध्य प्राप्त करने के लिए एक तत्वों द्वारा एक निकाल सकते हैं । लेकिन यह दृष्टिकोण समय लेगा ।हे(nलॉगn)nn/2हे(nलॉगn)

क्या हम समय में किसी विधि द्वारा ऐसा कर सकते हैं ? अगर हम कर सकते हैं, तो कैसे?हे(n)



1
@JukkaSuomela इसे एक त्वरित और सरल उत्तर क्यों नहीं बनाया गया (एक ऐसे एल्गोरिथ्म के संक्षिप्त विवरण के साथ, आदर्श रूप से)?
राफेल

2
संबंधित मेटा चर्चा पर ध्यान दें ; जैसा कि यह पता चला है, सरल वेब खोजें इस प्रश्न के उत्तर की ओर ले जाती हैं।
राफेल

जवाबों:


45

यह एक की एक विशेष मामला है चयन एल्गोरिथ्म है कि पा सकते हैं वें के साथ एक सरणी का सबसे छोटा तत्व कश्मीर सरणी के आकार का आधा है। एक कार्यान्वयन है जो सबसे खराब स्थिति में रैखिक है।

सामान्य चयन एल्गोरिथ्म

पहले आइए एक एल्गोरिथ्म देखें जो k को एक सरणी का सबसे छोटा तत्व find-kthपाता है :

find-kth(A, k)
  pivot = random element of A
  (L, R) = split(A, pivot)
  if k = |L|+1, return pivot
  if k ≤ |L|  , return find-kth(L, k)
  if k > |L|+1, return find-kth(R, k-(|L|+1))

फ़ंक्शन ऐसा split(A, pivot)लौटाता है L,Rकि सभी तत्व सभी Rसे अधिक होते हैं pivotऔर Lअन्य सभी (शून्य से एक घटना pivot) होते हैं। फिर सभी पुनरावर्ती किया जाता है।

यह औसत है लेकिन सबसे खराब स्थिति में ( एन 2 ) है।हे(n)हे(n2)

रैखिक सबसे खराब स्थिति: मंझला-की-मंझला एल्गोरिदम

एक बेहतर धुरी Aआकार 5 के उप-सरणियों के सभी माध्यकों का माध्यिका है , इन मध्यस्थों की सरणी पर प्रक्रिया का उपयोग करके।

find-kth(A, k)
  B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
  pivot = find-kth(B, |B|/2)
  ...

यह सभी मामलों में गारंटी देता है । यह स्पष्ट नहीं है। ये पावरपॉइंट स्लाइड एल्गोरिथ्म और जटिलता दोनों को समझाने में सहायक हैं।हे(n)

ध्यान दें कि अधिकांश समय एक यादृच्छिक धुरी का उपयोग करके तेज होता है।


क्या यह आकार 5मानक है? यदि A का आकार 5 से कम है तो क्या होगा?
जयेश

किसी भी निश्चित n के लिए, जटिलता स्थिर है, जब तक कि यह अनंत नहीं है। तो, आप इस तरह के विशेष मामले के लिए परिमित जटिलता के साथ किसी भी वैध एल्गोरिथ्म का उपयोग कर सकते हैं, भले ही वह O (2 ^ n) हो। एक निश्चित n के लिए (अर्थात बाहर के मामले में अधिकतम 4), जटिलता सबसे अधिक O (2 ^ 4) = O (1) है।
v6ak

3
पहले एल्गोरिथ्म पर: return A[k]गलत है (जब तक Aकि सॉर्ट नहीं किया जाएगा जो एल्गोरिथ्म को मूट कर देगा)। यदि splitऐसा विभाजित करने के लिए हुआ है Aकि k = |L| + 1आपको अभी भी पता नहीं है कि kवें तत्व कहां है। आपका आधार मामला तब है जब |A| = 1आपको अभी भी दो पुनरावर्ती कॉलों में से एक बनाने की आवश्यकता है।
वॉचक्रान

2
@NickCaplinger का उपयोग कर web.archive.org तय
jmad

1
सामान्य चयन एल्गोरिथ्म हे (NlogN) के लिए सबसे खराब स्थिति नहीं है? यहां तक कि अगर पुनरावर्ती कॉल पत्ते प्रत्येक कॉल के बाद सरणी के केवल 10% है, तो यह अभी भी आधार से 10 में एक लघुगणक है
ऑक्टेवियन

6

n-1/4हे(n)

एल्गोरिथ्म का मुख्य विचार नमूना का उपयोग करना है। हमें दो तत्वों को ढूंढना होगा जो कि सरणी के क्रमबद्ध क्रम में एक साथ करीब होते हैं और उनके बीच माध्य झूठ होता है। संपूर्ण चर्चा के लिए संदर्भ [MU2017] देखें।


[MU2017] माइकल मिटज़ेनमाकर और एली उपफ़ल। "प्रायिकता और कम्प्यूटिंग: एल्गोरिदम और डेटा विश्लेषण में यादृच्छिककरण और संभाव्य तकनीक," अध्याय 3, पृष्ठ 57-62। कैम्ब्रिज यूनिवर्सिटी प्रेस, दूसरा संस्करण, 2017।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.