O (k) में सरणी में सबसे छोटे k तत्व ढूंढना


12

यह एक दिलचस्प सवाल है जो मैंने वेब पर पाया है। N संख्याओं वाले एक सरणी को देखते हुए (उनके बारे में कोई जानकारी नहीं), हमें सरणी को रैखिक समय में पूर्व-संसाधित करना चाहिए ताकि हम O (k) समय में k सबसे छोटे तत्वों को वापस कर सकें, जब हमें नंबर 1 <= k दिया जाता है <= एन

मैं कुछ दोस्तों के साथ इस समस्या पर चर्चा कर रहा हूं लेकिन कोई भी समाधान नहीं ढूंढ सका है; किसी भी सहायता की सराहना की जाएगी!

त्वरित नोट:-k सबसे छोटे तत्वों का क्रम महत्वपूर्ण नहीं है-सरणी में तत्व संख्या हैं, पूर्णांक हो सकते हैं और (इसलिए कोई मूलांक क्रमांक नहीं) हो सकता है-पूर्व प्रसंस्करण चरण में संख्या k का पता नहीं है। प्रीप्रोसेसिंग O (n) समय है। O (k) समय पर फ़ंक्शन (k सबसे छोटे तत्व ढूंढें)।


4
मिन-हीप का उपयोग कैसे करें?
शायर

1
K-skyband और top-k कम्प्यूटेशन देखें। पेपर cssfu.ca/~jpei/publications/subsky_tkde07.pdf से संबंधित साहित्य की अच्छी समीक्षा है।
आंद्रेस सलामोन

1
शिर-I ने मिन-हीप विचार की जांच की है। हालाँकि, मिन हीप में k छोटी संख्या को मुद्रित करने के लिए O (klogn) समय है और आवश्यकता के अनुसार O (k) नहीं है
Idan

4
@idannik: क्यों आप इसे लेता है लगता है को खोजने के लिए समय कश्मीर एक मिनट-ढेर में सबसे छोटी तत्वों? Ω(klogn)
क्रिस्टोफर अर्नसेफेल्ट हैनसेन

8
मुझे नहीं लगता कि यह शोध-स्तर है। यह एक असाइनमेंट की तरह दिखता है। आपको यह कहाँ से मिला?
केव

जवाबों:


24

Preprocess की सरणी समय में मूल्यों हे ( एन ) :nहे(n)

  • मैंn
  • जबकि मैं>2
    • A [ 1 .. i ] के माध्य की गणना समय O ( i ) में करें[1 ..मैं]हे(मैं)
    • विभाजन में एक [ 1 .. मैं / 2 - 1 ] मीटर और एक [ मैं / 2 + 1 .. मैं ] मीटर एक ही समय में।[1 ..मैं][1 ..मैं/2-1][मैं/2+1 ..मैं]
    • मैंमैं/2

कुल precomputation समय के भीतर है हे(1+2+4++n)हे(n)

के लिए एक प्रश्न के उत्तर में सबसे छोटी तत्व एक समय में हे ( कश्मीर ) :हे()

  • एललॉग2
  • चयन वें तत्व एक्स के एक [ 2 एल.2 एल + 1 ] समय में हे ( 2 एल ) हे ( कश्मीर )(-2एल)एक्स[2एल.2एल+1]हे(2एल)हे()
  • विभाजन x द्वारा एक ही समय में[2एल.2एल+1]एक्स

में k सबसे छोटे तत्व हैं।[1 ..]

संदर्भ:

  • 1999 में, डोर और ज़्विक ने 2.942 n + o ( n ) तुलनाओं के भीतर समय में तत्वों के माध्यिका की गणना करने के लिए एक एल्गोरिथ्म दिया , जो 6 n से कम तुलनाओं में n unordered तत्वों से k वें तत्व का चयन करने के लिए एक एल्गोरिथ्म देता है ।n2.942n+(n)n6n

1
मैं बाहरी पाश 'में मैं के लिए माना जाता है लगता है '। क्या आपका एल्गोरिथ्म युवल फिल्मस के उत्तर में एक से अलग है? {2एलजीn,...,4,2,1}
रादु GRIGore

2
यह मेरे एल्गोरिथ्म का एक सामान्यीकरण है मनमाना । यह कुछ कार्यान्वयन विवरणों को भी बताता है जो (जानबूझकर) मेरे जवाब से बचे थे। n
युवल फिल्मस

3
@YuvalFilmus क्या आप अपनी टिप्पणी के द्वारा इसका मतलब निकालना चाहते हैं कि मेरा उत्तर अनैतिक रूप से आपके करीब है? यह वह समाधान है जो मेरे मन में आया था जब मैंने प्रश्न की समीक्षा की। मैंने देखा कि आपने एक समान पोस्ट किया था, लेकिन यह अस्पष्ट पाया, इसलिए मैंने अपना लिखा (जैसा कि आपका एक प्रमुख संपादन करने के लिए विरोध किया गया है)। जो मायने रखता है वह अंतत: व्यवस्थाओं के उत्तरों की गुणवत्ता है, न कि वास्तव में जिन्होंने उन्हें लिखा है: बैज और प्रतिष्ठा केवल प्रोत्साहन हैं, स्वयं में उद्देश्य नहीं।
जेरेमी

4
@ जेरेमी बिल्कुल नहीं; बस यह है कि दो समाधान समान हैं (लेकिन तुम्हारा काम लिए काम करता है ), और यह कि मैं वास्तव में एक होमवर्क प्रश्न के मामले में विवरण नहीं दे रहा था। n
युवल फिल्मस

2
ओह :( इसके बारे में तब क्षमा करें। (सोचा था कि मैं अभी भी असाइनमेंट संदेह पर प्राथमिकता देने के लिए पूर्ण उत्तर देना चाहूंगा)
जेरेमी

14

सरलता के लिए मान लें कि 2 मीटर - 1 , 2 मीटर - 2 , 2 मीटर - 3 , , 1 पदों पर तत्वों को खोजने के लिए रैखिक समय चयन एल्गोरिथ्म का उपयोग करें ; यह रैखिक समय लेता है। यह देखते हुए कश्मीर , खोजने के टी ऐसी है कि 2 टी - 1कश्मीर 2 टी ; ध्यान दें कि 2 टी2 कश्मीर । अधिकतम 2 टी पर रैंक के सभी तत्वों को फ़िल्टर करेंn=22-1,2-2,2-3,...,1टी2टी-12टी2टी22टी, और अब स्थिति समय O ( 2 t ) = O ( k ) में तत्व को खोजने के लिए रैखिक समय चयन एल्गोरिथ्म का उपयोग करें ।O(2t)=O(k)

स्पष्टीकरण: यह लग सकता है कि पूर्व प्रसंस्करण समय लगता है , और कहा कि वास्तव में मामला है अगर आप सावधान नहीं कर रहे हैं। यहां बताया गया है कि रैखिक समय में प्रीप्रोसेसिंग कैसे करें:Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

इन-प्लेस विभाजन को क्विकॉर्ट की तरह किया जाता है। चल रहा है समय में रेखीय है , और इतना रैखिक। अंत में, सरणी A निम्नलिखित संपत्ति को संतुष्ट करता है: प्रत्येक k के लिए , A [ 0 .. n / 2 k - 1 ] में n / 2 k सबसे छोटे तत्व होते हैं।n+n/2+n/4++1<2nAkA[0..n/2k1]n/2k


1
सहज रूप में। यदि सरणी को क्रमबद्ध किया जाता है, तो आप इसे में प्रीप्रोसेसिंग के बिना हल कर सकते हैं । शायद आप रैखिक समय चयन एल्गोरिथ्म के बारे में नहीं जानते हैं जो समय ( n ) में k सबसे बड़ा तत्व पा सकते हैं ? O(1)kO(n)
युवल फिल्मस

4
@ युवल फिल्मस: क्या आप कुल एन लॉग एन चरणों के लिए एल्गोरिथ्म बार नहीं चला रहे हैं ? या आपके मन में किसी तरह का इंटरलेइंग हुआ? lognnlogn
आंद्र सलाम

3
@ AndrásSalamon: यदि आप जेरेमी द्वारा दिए गए उत्तर को पढ़ते हैं (जो मुझे लगभग उसी के समान दिखता है) तो आप देखते हैं कि आप पहले पूरी सरणी की प्रक्रिया करते हैं, फिर पहली छमाही, और इसी तरह।
रादु GRIGore

3
@ AndrásSalamon Radu सही है। माध्यिका को खोजने के बाद, आप सरणी (इन-प्लेस) को उसके निचले और ऊपरी आधे भाग में विभाजित करते हैं, फिर निचले आधे भाग पर पुन: प्रवेश करते हैं। चलने का समय तो के लिए आनुपातिक है n+n/2+n/4++1<2n
युवल फिल्मस

5
संयोग से यह एल्गोरिथ्म मेरे पहले के प्रश्न के उत्तर के रूप में एक सबरूटीन के रूप में प्रकट होता है: cstheory.stackexchange.com/questions/17378/…
David Eppstein

2

मिन-हीप बनाने के लिए पहले O(n) का उपयोग करें । यह ज्ञात है कि हम मिन-हीप में k सबसे छोटे तत्वों को खोजने के लिए O(k) का उपयोग कर सकते हैं :k

फ्रेडरिकसन, ग्रेग एन। , मिन-हीप , इन्फ में चयन के लिए एक इष्टतम एल्गोरिथ्म । कंप्यूटर। 104, नंबर 2, 197-214 (1993)। ZBL0818.68065 ।।


1
मैं यह नहीं देखता कि हम कैसे समय ( के ) में एक न्यूनतम-ढेर से सबसे छोटे तत्वों को निकाल सकते हैं , क्योंकि प्रत्येक तत्व को हटाने से ढेर के आकार में लघुगणक समय लगता है। क्या आप स्पष्ट कर सकते हैं कि आपके मन में यहाँ क्या था? धन्यवाद! kO(k)
a3nm

@ a3nm यह वास्तव में एक साधारण एल्गोरिथ्म नहीं है, लेकिन मैंने संदर्भ को अपडेट कर दिया है।
hqztrue

क्षमा करें, जहां तक ​​मैं उस संदर्भ को बता सकता हूं जो आपने जोड़ा था, तो -th सबसे छोटे तत्व (यानी, एक एकल तत्व, न कि k सबसे छोटे तत्व) का समय O ( k ) में चयन करने के बारे में बात करता है । मैं यह नहीं देखता कि यह k सबसे छोटे तत्वों को निकालने के लिए कैसे अनुकूल होगा । क्या आप शायद संदर्भ को समझा या अपडेट कर सकते हैं? kkO(k)k
a3nm

@ a3nm हाँ संदर्भ केवल आपको -th सबसे छोटा तत्व x देता है । हालांकि यह जानने के बाद, आप सभी तत्वों को खोजने के लिए ढेर में एक dfs कर सकते हैं < x in O ( k )kx<xO(k)
hqztrue

क्षमा करें, मुझे नहीं पता कि इन तत्वों को खोजने के लिए आप किस DFS का प्रदर्शन करेंगे? (उनमें से कुछ के पूर्वजों नहीं हो सकता है , ढेर में मई के सबसे छोटा तत्व, यानी जहाँ तक मैं, पता लगाने जैसे, बता सकते हैं कश्मीर / 2 मई के तत्व की स्थिति को जानते हुए भी कश्मीर वें तत्व तुच्छ नहीं है ।)kk/2k
a3nm

0

खोजने के लिए रेखीय समय चयन का उपयोग करें वां सबसे बड़ा तत्व है, तो quicksort से एक विभाजन कदम का उपयोग कर कश्मीर धुरी के रूप में वां सबसे बड़ा तत्व।k


1
मूल प्रश्न में उल्लेख किया गया है कि को प्रीप्रोसेसिंग समय पर नहीं जाना जाता है ....k
जेरेमी

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