हम इस हल कर सकते हैं में यह करना होगा इसे खोजने/उनमें से एक की जरूरत है, इसका मतलब है। द्विआधारी खोज। रैखिक समय से बेहतर है। तो हमें एक तिगुना खोजने की जरूरत है जैसे कि A[n-1] >= A[n] <= A[n+1]
।
पहले दिए गए सरणी के मध्य को ढूंढें। यदि मध्य अपने बाएं से छोटा है और इसके दाएं से बड़ा है। फिर वापस आओ, आपका जवाब है। संयोग से यह आपके रिकर्सन में बेसकेस होगा। इसके अलावा यदि len(arr) < 3
भी वापस आते हैं। एक और बेसकेस।
अब रिकर्सन परिदृश्य आता है। जब रिकर्स करना है, तो हमें और अधिकार का निरीक्षण करना होगा। इसके लिए, यदि मध्य बाईं ओर तत्व से अधिक है तो सरणी के बाईं ओर एक उपप्रोबल के रूप में छोड़ने पर विचार करें और इस नई सरणी के साथ पुनर्संरचना करें। यानी इस बिंदु पर मूर्त शब्दों में हमारे पास ...2
...
इंडेक्स n
6 के साथ होगा। इसलिए हम बाईं ओर जाते हैं यह देखने के लिए कि 2
के बाईं ओर वाला तत्व ट्रिपलेट पूरा करता है या नहीं।
अन्यथा यदि मध्य अपने दाएं उपराष्ट्रय पर तत्व से अधिक है तो सरणी के दाहिने ओर 1 + को उपप्रोबलेम और रिकर्स के रूप में मानें।
अधिक थ्योरी: उपरोक्त समस्या को समझने लेकिन पर पढ़ने के लिए पर्याप्त होना चाहिए। तत्वों के दिए गए सेट में स्थानीय मिनीमा खोजने के लिए समस्या अनिवार्य रूप से उबलती है। सरणी में एक संख्या को स्थानीय मिनीमा कहा जाता है यदि यह दोनों बाएं और दाएं संख्याओं से छोटा होता है जो ठीक से A[n-1] >= A[n] <= A[n+1]
तक उबाल जाता है।
एक दिया गया सरणी जैसे कि इसके पहले 2 तत्व घट रहे हैं और अंतिम 2 तत्व बढ़ रहे हैं स्थानीय मिनीमा होने के लिए। ऐसा क्यों है? आइए इसे अस्वीकार करके साबित करें। यदि पहले दो नंबर कम हो रहे हैं, और कोई स्थानीय न्यूनतम नहीं है, तो इसका मतलब है कि तीसरा नंबर दूसरे नंबर से कम है। अन्यथा दूसरा नंबर स्थानीय न्यूनतम होगा। उसी तर्क के बाद चौथी संख्या तीसरे नंबर से कम होनी चाहिए और इसी तरह आगे भी। इसलिए सरणी में संख्या घटते क्रम में होनी चाहिए।जो बढ़ते क्रम में पिछले दो संख्याओं की बाधा का उल्लंघन करता है। यह अस्वीकार करता है कि स्थानीय न्यूनतम होने की आवश्यकता है।
उपर्युक्त सिद्धांत O(n)
रैखिक दृष्टिकोण का सुझाव देता है लेकिन हम निश्चित रूप से बेहतर कर सकते हैं। लेकिन सिद्धांत निश्चित रूप से हमें समस्या के बारे में एक अलग परिप्रेक्ष्य देता है।
कोड: यहाँ अजगर कोड है (FYI - stackoverflow पाठ संपादक मुक्तहस्त में टाइप किया गया था, यह misbheave सकता है)।
def local_minima(arr, start, end):
mid = (start+end)/2
if mid-2 < 0 and mid+1 >= len(arr):
return -1;
if arr[mid-2] > arr[mid-1] and arr[mid-1] < arr[mid]: #found it!
return mid-1;
if arr[mid-1] > arr[mid-2]:
return local_minima(arr, start, mid);
else:
return local_minima(arr, mid, end);
ध्यान दें कि मैं सिर्फ n
की अनुक्रमणिका लौटाता हूं। ट्रिपल को प्रिंट करने के लिए केवल -1
और +1
लौटाए गए इंडेक्स में करें। source
क्या होगा यदि कोई नहीं है, तो आपको एन^3 समाधान करने की आवश्यकता क्यों होगी, यह रैखिक – aaronman
में करना आसान लगता है आपने इनपुट के बारे में जो कुछ भी बताया है उसका स्पष्ट विवरण नहीं दिया है। 'ए [एन -1]> = ए [एन -2] 'में' एन' क्या है? अनुक्रम की लंबाई? कुछ सीमा में कोई सूचकांक? – user2357112
मैंने अभी सवाल को समझ लिया है, यह दिलचस्प है लेकिन मुझे लगता है कि आपको इसे बेहतर समझाए जाने की कोशिश करनी चाहिए – aaronman