O (n) समय में: सेट में सबसे बड़ा तत्व ढूंढें जहां तुलना संक्रमणीय नहीं है


21

शीर्षक प्रश्न बताता है।

हमारे पास तत्वों की सूची के रूप में इनपुट है, कि हम तुलना कर सकते हैं (यह निर्धारित करें कि कौन सा सबसे बड़ा है )। कोई भी तत्व बराबर नहीं हो सकता।

प्रमुख बिंदु:

  1. तुलना संक्रमणीय नहीं है (रॉक पेपर कैंची के बारे में सोचें): यह सच हो सकता है: ए> बी, बी> सी, सी> ए (ध्यान दें कि यह एक वैध इनपुट नहीं है क्योंकि यहां कोई वैध उत्तर नहीं है, मैं केवल यह वर्णन कर रहा हूं कि क्या है " गैर-सकर्मक तुलना "साधन"
  2. प्रत्येक इनपुट ऐरे को जवाब देने की गारंटी होगी
  3. सबसे बड़ा मतलब है कि तत्व हर दूसरे तत्व से अधिक होना चाहिए
  4. सम्‍पत्ति गुण रखता है अर्थात A> B का अर्थ है कि B <A

उदाहरण:

Input: [A,B,C,D]
A > B, B > C, C > A
D > A, D > B, D > C
Output: D

मैं O (n) समय में ऐसा करने का कोई तरीका नहीं निकाल सकता, मेरा सबसे अच्छा समाधान O (n ^ 2) है।

मैं इस तथ्य के कारण हर दृष्टिकोण पर अटक जाता हूं कि किसी उत्तर के बारे में निश्चित होने के लिए, तत्व को स्पष्ट रूप से हर दूसरे तत्व की तुलना में होना चाहिए, यह साबित करने के लिए कि वास्तव में इसका उत्तर है (क्योंकि तुलनात्मक रूप से तुलनात्मक नहीं है)।

यह एक ढेर, छँटाई, आदि के उपयोग को नियंत्रित करता है।


8
यह स्पष्ट नहीं है कि "सबसे महान तत्व" को कैसे परिभाषित किया जाएगा? उदाहरण के लिए, यदि कौन सा तत्व सबसे बड़ा है ? क्या आपके पास तुलना के कोई अन्य नियम हैं? A>B,B>C,C>
fade2black

6
मैं सोच भी नहीं सकता कि हम एक सेट में सबसे बड़ा तत्व कैसे चुनेंगे जो कम से कम आंशिक रूप से ऑर्डर नहीं किया गया हो। कृपया सबसे बड़े और कम से कम तत्व की परिभाषा देखें । आंशिक आदेश से पारगमन नियमों का अभाव।
fade2black

3
@ fade2black आप मुझे "सबसे बड़ी" की दूसरी परिभाषा से क्यों जोड़ रहे हैं। मैं स्पष्ट रूप से इस प्रश्न के संदर्भ के लिए सबसे बड़ी परिभाषा बता रहा हूं। महानतम का अर्थ है, तत्व हर दूसरे तत्व से अधिक है। कोई तत्व बराबर नहीं है। इसके लिए वहां यही सब है। क्या यह स्पष्ट नहीं है?
जेम्स विर्ज़बा

2
ए, बी, सी, डी के साथ आपका अंतिम उदाहरण आपके प्रश्न को समझने में मददगार होगा यदि आप इसे अपने ओपी में शामिल करते हैं।
fade2black

3
C # संकलक टीम का एक सदस्य इसे साक्षात्कार प्रश्न के रूप में पूछता था; यह प्रासंगिक है क्योंकि C # में, अधिभार रिज़ॉल्यूशन एल्गोरिथ्म को एक सेट के अद्वितीय सर्वश्रेष्ठ सदस्य को चुनना चाहिए जिसे "बेटर्नलेस" संबंध दिया जाता है जो आमतौर पर होता है, लेकिन जरूरी नहीं कि वह सकर्मक हो। (या ऐसी कोई सबसे अच्छी सदस्य न होने पर उपयुक्त प्रतिक्रिया दें; संबंध संभव हैं।) हालांकि मैं इसका सही उत्तर देने में कामयाब रहा, मैंने कभी नहीं सोचा कि यह एक विशेष रूप से अच्छा साक्षात्कार प्रश्न था क्योंकि यह एक "अहा" अंतर्दृष्टि पर निर्भर करता है। रैखिक एल्गोरिदम।
एरिक लिपर्ट

जवाबों:


38

अधिकतम अभी भी काम करने के लिए मानक एल्गोरिथ्म। के साथ शुरू करो और तत्वों पर चलते हैं, अगर आप एक बड़ा मूल्य देखते हैं, अधिकतम अद्यतन कि मूल्य किया जाना है। इसका कारण यह है कि आपके द्वारा छोड़ा गया प्रत्येक तत्व कम से कम एक तत्व से छोटा है, और इस प्रकार अधिकतम नहीं हो सकता है।a1

स्पष्ट होने के लिए, "मानक एल्गोरिथ्म" से मेरा मतलब निम्नलिखित है:

max <- a_1
for i=2 to n
   if a_i > max
      max <- a_i
output max

पूर्णता के लिए, मैं यहां टिप्पणियों में उठाए गए मुद्दों पर चर्चा करूंगा। उपरोक्त चर्चा में सेटिंग एक विरोधी सममित संबंध के लिए एक अधिकतम रिश्तेदार रही है , जहां एक मैं एक अधिकतम है अगर सभी के लिए जे मैं हमारे पास एक मैं > एक जे । उपरोक्त एल्गोरिथ्म इस धारणा के तहत काम करता है कि एक अधिकतम मौजूद है, हालांकि अगर यह ज्ञात नहीं है, तो कोई अधिकतम के अस्तित्व को सत्यापित करने के लिए इसका उपयोग कर सकता है (यह जांचें कि क्या रिटर्न किया गया तत्व वास्तव में अन्य सभी तत्वों से अधिक है, यह ची की टिप्पणी में उल्लिखित है। और इल्मरी करोनन जवाब में)।<aijiai>aj

यदि आवश्यक रूप से विरोधी सममित नहीं है, तो उपरोक्त एल्गोरिथ्म विफल रहता है (जैसा कि एमिल ने टिप्पणियों में उल्लेख किया है)। यदि < एक मनमाना संबंध है (यानी हम दोनों पारगमन और विरोधी समरूपता को आराम कर रहे हैं), तो यह दिखाना मुश्किल नहीं है कि रैखिक समय में अधिकतम खोजना संभव नहीं है। द्वारा निरूपित # एक मैं समय की संख्या एक मैं एक प्रश्न में भाग लिया है, हम एक तरह से एक विरोधात्मक संबंध है कि अधिकतम पर्याप्त क्वेरी बिना खुलासा नहीं किया जा सकता है परिभाषित करते हैं। क्वेरी को देखते हुए एक मैं > ? j a , a i > a j if # a i उत्तर दें<<#aiaiai>?ajai>aj और एक मैं < एक j अन्यथा। यदि प्रश्नों की संख्या( n 2 ) है , तो एक अधिकतम अभी तक नहीं देखा गया था, और इसे सेट में किसी भी तत्व के रूप में सेट किया जा सकता है।#ai<n1ai<ajo(n2)


1
@JamesWierzba (मुझे लगता है) वह सिर्फ एक "छोड़ दिया" तत्व का मतलब है कि आपके वर्तमान अधिकतम से अधिक नहीं है। मानक एल्गोरिथ्म पर विचार करें: आप अपनी सूची में वर्तमान अधिकतम के खिलाफ प्रत्येक मूल्य की जांच करते हैं। आपने कहा है कि प्रत्येक सूची में सबसे बड़ा तत्व है। कुछ बिंदु पर, आप तुलना करेंगे कि आपके वर्तमान अधिकतम के खिलाफ है, और चूंकि यह बड़ा है, यह मान आपका नया अधिकतम हो जाता है। क्योंकि यह मान सूची में अन्य सभी चीज़ों से अधिक है, इसलिए आपको कभी ऐसा तत्व नहीं मिलेगा जो अधिक से अधिक हो, और आपका सबसे बड़ा मूल्य प्रतिस्थापित नहीं किया जाएगा। आपकी nतुलना के बाद , आपके वर्तमान अधिकतम का जवाब होना चाहिए
लॉर्ड फरक्वाड

1
स्पष्टता के लिए संपादित किया गया, यह एल्गोरिथ्म परिवर्तनशीलता नहीं मानता है। यदि आपको लगता है कि विश्वास करना मुश्किल है, तो शुद्धता प्रमाण के विवरण का पालन करें (विरोधाभास के उद्देश्य के लिए मान लें कि लौटा मूल्य अधिकतम नहीं है, और पहले पैराग्राफ से विचार का उपयोग करें)।
एरियल

7
यह प्रश्न में अनुमान 2 पर निर्भर करता है: हमेशा सरणी में अधिकतम होता है। यदि ऐसा नहीं होता, maxतो केवल एक सबअरे का अधिकतम हिस्सा हो सकता है। फिर भी, 2 धारणा के बिना भी, एक अस्थायी अधिकतम प्राप्त कर सकता है, और फिर ओ (एन) बाध्य के भीतर एक दूसरे स्कैन का उपयोग करके पूरे सरणी पर इसे सत्यापित कर सकता है।
चि

7
यह उत्तर मानता है कि और B > A एक ही समय में धारण नहीं कर सकते। जहां तक ​​मैं देख सकता हूं, इस सवाल में खारिज नहीं किया गया है। A>BB>A
एमिल जेकाबेक

4
@ oconnor0 जो पालन नहीं करता है। एक ठोस उदाहरण के लिए, मान लें कि ए> बी, ए> सी, बी> ए, और सी> बी। फिर ए सेट में किसी भी अन्य तत्व से अधिक है (और इस संपत्ति के साथ एकमात्र तत्व है), लेकिन अगर तत्व हैं आदेश ए, बी, सी, एल्गोरिथ्म में सी का उत्पादन होगा
एमिल जेकाबेक मोनिका

24

एरियल नोट के रूप में , मानक अधिकतम-एल्गोरिथ्म नीचे दिया गया है:

def find_maximum(a):
    m = a[0]
    for x in a:
        if x > m: m = x
    return m

जब तक संशोधन के बिना वास्तव में काम करेंगे:

  • तत्वों की किसी भी जोड़ी की तुलना की जा सकती है, और
  • इनपुट में एक अधिकतम तत्व, यानी एक तत्व होता है जो इनपुट में किसी भी अन्य तत्व की तुलना में अधिक बड़ा होता है।

(ऊपर की पहली धारणा वास्तव में आराम कर सकती है, यहां तक ​​कि एल्गोरिथ्म को संशोधित किए बिना भी, जब तक हम यह मान लेते हैं कि अधिकतम तत्व हर दूसरे तत्व के साथ तुलनीय है और x > yयह हमेशा गलत है अगर तत्व xऔर yअतुलनीय हैं।)

विशेष रूप से, आपका दावा है कि:

[…] एक उत्तर के कुछ होने के लिए, तत्व को स्पष्ट रूप से हर दूसरे तत्व की तुलना में करने की आवश्यकता होती है (क्योंकि तुलनात्मक रूप से तुलनात्मक नहीं है)।

ऊपर दी गई मान्यताओं के तहत सच नहीं है। वास्तव में, यह साबित करने के लिए कि ऊपर दिए गए एल्गोरिदम को हमेशा अधिकतम तत्व मिलेगा, यह देखने के लिए पर्याप्त है:

  1. चूंकि लूप सभी इनपुट तत्वों पर पुनरावृति करता है, कुछ पुनरावृत्ति xमें अधिकतम तत्व होगा;
  2. चूँकि अधिकतम तत्व हर दूसरे तत्व की तुलना में अधिक बड़ा होता है, इसलिए यह उस पुनरावृत्ति के अंत में, mअधिकतम तत्व होगा; तथा
  3. चूँकि कोई भी अन्य तत्व अधिकतम तत्व की तुलना में युग्मक नहीं हो सकता है, यह इस प्रकार है कि mबाद के किसी भी पुनरावृत्तियों पर नहीं बदलेगा।

इसलिए, लूप के अंत में, mहमेशा अधिकतम तत्व होगा, यदि इनपुट में एक है।


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

def find_maximum_if_any(a):
    # step 1: find the maximum, if one exists
    m = a[0]
    for x in a:
        if x > m: m = x

    # step 2: verify that the element we found is indeed maximal
    for x in a:
        if x > m: return None  # the input contains no maximal element
    return m  # yes, m is a maximal element

(मैं यहाँ मान रहा हूँ कि यह संबंध >अकाट्य है, अर्थात कोई भी तत्व अपने आप से बड़ा नहीं हो सकता है। यदि जरूरी नहीं है कि x > mचरण 2 में तुलना को बदल दिया जाए x ≠ m and x > m, जहाँ पहचान की तुलना को दर्शाता है। या हम केवल अनुकूलन लागू कर सकते हैं। नीचे उल्लेख किया गया।)

एल्गोरिथ्म के इस बदलाव की शुद्धता को साबित करने के लिए, दो संभावित मामलों पर विचार करें:

  • यदि इनपुट में एक अधिकतम तत्व है, तो चरण 1 इसे ढूंढेगा (जैसा कि ऊपर दिखाया गया है) और चरण 2 इसकी पुष्टि करेगा।
  • इनपुट करता है नहीं एक अधिक से अधिक तत्व होते हैं, तो चरण 1 के रूप में कुछ मनमाने ढंग से तत्व उठा खत्म हो जाएगा m। इससे कोई फर्क नहीं पड़ता कि यह कौन सा तत्व है, क्योंकि यह किसी भी मामले में गैर-अधिकतम होगा, और इसलिए चरण 2 यह पता लगाएगा और वापस आ जाएगा None

हम के सूचकांक संग्रहीत हैं mइनपुट सरणी में a, हम कर सकते थे वास्तव में केवल उन तत्वों को पहले आने की जाँच करने का अनुकूलन चरण 2 mमें a, किसी भी बाद में तत्वों के बाद से पहले से ही के साथ तुलना में किया गया है mचरण 1 में लेकिन इस अनुकूलन asymptotic समय जटिलता नहीं बदलता है एल्गोरिथ्म, जो अभी भी हे ( एन ) है।


3
वास्तव में ओपी कई विवरणों को छोड़ देता है। उदाहरण के लिए, संबंध की संवेदनशीलता के बारे में कुछ भी नहीं कहा जाता है, और इसलिए यदि यह प्रतिवर्त नहीं है तो if x > m:अपरिभाषित है।
fade2black

4

O(n)

यदि आप तत्वों की तुलना करने वाले अपनी सूची से गुजरते हैं, तो कोई भी तत्व जो "हारता है" एक तुलना को तुरंत खारिज कर दिया जा सकता है, सबसे बड़ा होने के लिए, यह सभी अन्य तत्वों से अधिक होना चाहिए ताकि एकल नुकसान इसे अयोग्य घोषित कर दे।

n1

यह समाधान एक सूक्ष्मता से सक्षम है: "कोई तत्व समान नहीं हो सकता है" इस तथ्य के साथ संयुक्त है कि हमेशा एक महान तत्व होगा। अगर हम रिश्तों को एक निर्देशित ग्राफ के रूप में जीतते हैं, तो यह स्पष्ट है कि हम जीत के बाद बस सबसे बड़े तत्व तक पहुँच सकते हैं।


1
" एसाइक्लिक निर्देशित ग्राफ " गलत मॉडल है: इसके बजाय " टूर्नामेंट " होना चाहिए । चक्रों की अनुमति है, और यह महत्वपूर्ण है कि प्रत्येक किनारे बिल्कुल एक दिशा में मौजूद हो।
पीटर टेलर

@PeterTaylor आप बिल्कुल सही हैं, मैं केवल उन जीत के बारे में सोच रहा था जो 'सबसे बड़े' तत्व की ओर ले जाती हैं, अन्य जीतें कम प्रासंगिक हैं लेकिन सबसे बड़ी खोज के मार्ग पर आगे बढ़ सकती हैं ताकि आप सही हों कि वे कर सकें ' t रियायती हो
Danikov

3

मैं मानता हूं कि कम से कम एक तत्व (जो सबसे बड़े तत्व के अस्तित्व की गारंटी देता है) के लिए संबंध एंटीसिममेट्रिक है, अन्यथा कार्य असंभव है। यदि परिमित सेट के सभी तत्व तुलनीय हैं तो सामान्य रूप से अधिकतम-अधिकतम प्रक्रिया काम करती है।

यदि कुछ तत्व तुलनीय नहीं हैं, तो निम्नलिखित प्रक्रिया काम करेगी

max = nil
For i=1 to n
   if max is nil then
      max = a[i]
   if max and a[i] are not comparable then
      max = nil
   else if max < a[i] then
      max = a[i]
End

A,B,C,D

A>B,B>C,C>A
D>A,D>B,D>C


i=1: max=A
i=2: max=AA>B
i=3: max=CA<C
i=4: max=DD>C

m>aa<mamm<aamam


मुझे नहीं लगता कि पहली else ifजरूरत है। यदि maxअधिकतम है, तो इसे चालू नहीं किया जा सकता है और यदि अधिकतम अभी तक सामना नहीं किया गया है, तो इससे कोई फर्क नहीं पड़ता कि मूल्य क्या maxहै।
रिची

हाँ, यह पहला है। दूसरा एक दूसरा है :)
रिस्की

आपका मतलब ifबिना elseएस के छोड़ना है ? यह सिर्फ एक आदत है: elseएस के साथ हम तुलना भी नहीं करते हैं। :)
fade2black

1
क्या maxसूची के किसी भी तत्व के लिए और लूप के अंदर, इसे शुरू करना सरल नहीं होगा , if max and a[i] are comparable and max < a[i] then max = a[i](यदि स्थिति का पहला हिस्सा छोड़ दिया जाए तो क्या हम मान सकते हैं कि दो अतुलनीय तत्वों की तुलना करने की कोशिश हमेशा झूठी होती है)?
इल्मरी करोनें

1
@ ओबल्डेन ने माना कि हमेशा सबसे बड़ा तत्व होता है। आपके उदाहरण में कोई सबसे बड़ा तत्व नहीं है।
fade2black

2

A<BB<A

A1...AnAi<Aj

n2

Ai<Ajj

j0Ai<Aj0ijijAi<AjiijAij<Ajj0ij

मुझे उम्मीद है कि यह कुछ हद तक समझ में आएगा। टिप्पणियों में पूछने या संपादित करने के लिए स्वतंत्र महसूस करें।

मूल विचार यह है कि यदि आप पूरी तरह से मनमाने ढंग से संबंध बनाने की अनुमति देते हैं, तो आप पहले से ही जानते हैं कि शेष तत्वों के बारे में कोई भी जानकारी एकत्र नहीं कर सकते हैं।

A<Ann2n


1

A > Bn

इस तरह आप केवल प्रविष्टियों पर लूप कर सकते हैं और संभव समाधान के सेट से दूसरे से कम तत्व को हटा सकते हैं। हेशसेट या इसके समान में संभव हैO(n)

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