2015-04-26 8 views
8

से बेहतर क्रमबद्ध सॉ्रे में लापता इंटेगर ढूंढें मैं पहली बार एल्गोरिदम कक्षा के विश्लेषण के माध्यम से काम कर रहा हूं, और सोच रहा था कि कोई भी नीचे दिए गए उदाहरण में सहायता कर सकता है। मेरा मानना ​​है कि मैंने इसे ओ (एन) जटिलता के लिए हल किया है, लेकिन यह सोच रहा था कि कोई बेहतर संस्करण है कि मैं ओ (लॉगन) के बारे में नहीं सोच रहा हूं?एल्गोरिदम का विश्लेषण - ओ (एन)

Let एक = एक [1] < = ... < = एक [n + 1] n अलग पूर्णांकों का एक क्रमबद्ध सरणी, जिसमें प्रत्येक पूर्णांक रेंज [1 में है हो सकता है ... n + 1]। यही है, {1, ..., n + 1} से बिल्कुल एक पूर्णांक ए से गायब है। गायब पूर्णांक को खोजने के लिए एक efficeint एल्गोरिदम का वर्णन करें। अपने एल्गोरिदम के सबसे खराब केस जटिलता (सरणी ए तक पहुंच की संख्या) का विश्लेषण करें।

मेरे पास समाधान अपेक्षाकृत सरल है, और मेरा मानना ​​है कि एन जटिलता का सबसे खराब मामला है। शायद मैं उदाहरण सोच रहा हूं, लेकिन क्या कोई बेहतर समाधान है?

मेरे समाधान

for(i = 1; i < n +1; i++) : 
    if(A[i-1] > i) : 
     return i 

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

क्या यह सही तर्क है? क्या इसके बारे में जाने का कोई बेहतर तरीका है?

सहायता के लिए अग्रिम में पढ़ने और धन्यवाद के लिए धन्यवाद।

+0

हां। एक बेहतर समाधान है। संकेत: क्या आपको वास्तव में सरणी में हर तत्व को देखना है? – aquinas

+0

क्या आप समस्या का अपना विवरण साफ कर लेंगे? (1) यदि ए अलग है, तो इसका मतलब है कि वे बराबर नहीं हैं; तो क्यों न सिर्फ "ए [1] <ए [2] <..."? (2) यदि {ए [1], ए [2], ..., ए [एन + 1]} ⊆ {1, 2, ..., एन + 1}, फिर, ∀i, ए [i] = i, और तो कोई गुम पूर्णांक नहीं है। आपका टेक्स्ट "एन विशिष्ट पूर्णांक" कहता है, इसलिए यह ए [1], ए [2], ..., ए [एन + 1] नहीं हो सकता है। (3) आपकी समस्या का बयान कहता है कि ए ए [1] से शुरू होता है, लेकिन आपका समाधान ए [0] से शुरू होता है (और, टिप्पणियों में, आप कहते हैं कि सरणी सूचकांक [0] से शुरू होते हैं)। – Scott

उत्तर

9

यह तर्क निश्चित रूप से सही है, लेकिन यह ओ (एन) को हरा करने के लिए पर्याप्त तेज़ नहीं है क्योंकि आप प्रत्येक तत्व की जांच करते हैं।

आप इसे देखकर तेज़ी से कर सकते हैं कि A[i]==i, तो j < i पर सभी तत्व उनके उचित स्थान पर हैं।

  • चेक बीच
  • में तत्व यह गलत स्थान पर है, छोड़ दिया जाना: (लॉग एन) इस अवलोकन एक विभाजन और जीत दृष्टिकोण है कि हे में चलता है का निर्माण करने के लिए पर्याप्त होना चाहिए
  • अन्यथा, एक स्थान जहां A[i]==i और A[i+1]==i+2 के लिए जाना सही

अधिक औपचारिक रूप से, आप देख रहे हैं। आप सरणी के सिरों पर अंतराल के साथ शुरू करते हैं। अंतराल के बीच में प्रत्येक जांच शेष अंतराल twofold shrinks। किसी बिंदु पर आपको केवल दो तत्वों के अंतराल के साथ छोड़ दिया जाता है। बाईं ओर तत्व अंतिम "सही" तत्व है, जबकि दाईं ओर वाला तत्व गुम संख्या के बाद पहला तत्व है।

+0

मुझे इसे अंग्रेजी में बदलने के लिए एक शॉट लेने दें: - 1 का मध्य मान चुनें .... एन - यदि ए [i-1] (क्योंकि वैध पूर्णांक 1 से शुरू होते हैं, और सरणी पहुंच 0 से शुरू होती है)! = i - गायब तत्व बाईं ओर में होना चाहिए - 1 का मध्य चुनें .... I-1 ए [i-1]> i यह कार्य करता है जब तक दोबारा कुल्लाएं? – Busturdust

+0

और यदि मूल पिक ए [i-1] == i था, तो दाएं – Busturdust

+0

@ बुस्टर्डस्ट हां पर ऐसा ही करें, यही वह है। – dasblinkenlight

8

आप ए [i]> i के साथ पहली अनुक्रमणिका के लिए बाइनरी खोज सकते हैं। यदि गायब पूर्णांक के है, तो ए [i] = i iके और ए [i] = i + 1 i> = k के लिए।

3

कभी-कभी चाल किसी समस्या के बारे में सोचने के लिए होती है।

भावना में, आप बस बुलियन मूल्यों की एक सरणी के साथ काम कर रहे हैं; सूचकांक n पर प्रविष्टि a[n] > n की सत्य है।

इसके अलावा, यह सरणी शून्य या अधिक लगातार false से शुरू होती है, और शेष प्रविष्टियां सभी true हैं।

आपकी समस्या, अब, बूलियन मानों के क्रमबद्ध (क्रमबद्ध) सरणी में true के पहले उदाहरण की अनुक्रमणिका को ढूंढना है।

संबंधित मुद्दे