कार्यप्रणाली पर एक नोट
मैंने इस समस्या के बारे में थोड़ा सोचा, और एक समाधान आया। जब मैंने सईद अमीरी के उत्तर को पढ़ा , तो मुझे एहसास हुआ कि मैं जो कुछ ले आया था, वह सबसे लंबे समय तक अनुक्रम के लिए एल्गोरिथ्म ढूंढने के मानक मानक संस्करण का एक विशेष संस्करण था। मैं जिस तरह से समाधान के साथ आया था, उसे पोस्ट कर रहा हूं, क्योंकि मुझे लगता है कि समस्या हल करने का एक दिलचस्प उदाहरण है।
दो-तत्व संस्करण
आइए छोटे शुरू करें: तीन सूचकांकों की तलाश करें, जिन पर तत्व क्रम में हैं, आइए दो को देखें: ऐसा कि A [ i ] < A [ j ] ।मैं < जेA [ i ] < A [ j ]
तो कम हो रही है (यानी ∀ मैं < j , एक [ मैं ] ≥ एक [ जे ] , या समतुल्य रूप ∀ मैं , एक [ मैं ] ≥ एक [ मैं + 1 ] ), तो ऐसी कोई सूचकांकों हैं। अन्यथा, एक इंडेक्स i ऐसा है कि A [ i ] < A [ i + 1 ] ।ए∀ मैं < j , एक [ मैं ] ≥ एक [ जे ]∀ मैं , एक [ मैं ] ≥ एक [ मैं + 1 ]मैंA [ i ] < A [ i + 1 ]
यह मामला बहुत सरल है; हम इसे सामान्य करने का प्रयास करेंगे। यह दर्शाता है कि बताई गई समस्या हल नहीं है: अनुरोधित सूचकांक हमेशा मौजूद नहीं होते हैं। इसलिए हम बल्कि कहेंगे कि एल्गोरिथ्म या तो वैध सूचकांक लौटाता है, यदि वे मौजूद हैं, या सही ढंग से दावा करते हैं कि ऐसा कोई सूचकांक मौजूद नहीं है।
एल्गोरिथ्म के साथ आ रहा है
मैं शब्द का उपयोग करेंगे परिणाम को सरणी से एक उद्धरण मतलब करने के लिए सूचकांक से मिलकर कि लगातार नहीं हो सकता है ( ( ए [ मैं 1 ] , ... , एक [ मैं हूँ ] ) के साथ मैं 1 < ⋯ < मैं हूँ ), और रन का मतलब लगातार तत्वों के लिए एक ( ( ए [ मैं ] , एक [ मैं + 1 ] , ... , एक [ए( A [ i)1] , … , ए [ iम] )मैं1< ⋯ < मैंमए )।( ए [ मैं ] , एक [ मैं + 1 ] , ... , एक [ मैं + मीटर - 1 ] )
हमने सिर्फ यह देखा कि अनुरोधित सूचकांक हमेशा मौजूद नहीं होते हैं। हमारी रणनीति अध्ययन करना होगा जब सूचकांक मौजूद नहीं हैं। हम ऐसा करेंगे मान लीजिए कि हम सूचकांक ढूंढने का प्रयास कर रहे हैं और देख रहे हैं कि हमारी खोज कैसे गलत हो सकती है। फिर ऐसे मामले जहां खोज गलत नहीं होती है, सूचकांकों को खोजने के लिए एक एल्गोरिथ्म प्रदान करेगा।
दो सूचकांकों के साथ, हम लगातार सूचकांक पा सकते हैं। तीन सूचकांकों के साथ, हम और k = j + 1 के साथ आने में सक्षम नहीं हो सकते हैं । हालांकि, हम उस मामले पर विचार कर सकते हैं जब तीन सख्ती से बढ़ते तत्वों ( ए [ i ] < ए [ i [ 1 + 1 ] < ए [ आई + 2 ] ) को हल किया जाना है, क्योंकि इस तरह के रन को पहचानना आसान है और देखें कि यह शर्त कैसे पूरी नहीं हो सकती है। मान लीजिए कि अनुक्रम में सख्ती से लंबाई 3 की बढ़ती नहीं है।j = i + 1के = जे + १A [ i ] < A [ i + 1 ] < A [ i + 2 ]
अनुक्रम में केवल लंबाई 2 के सख्ती से बढ़ते रन हैं (जिसे मैं शॉर्ट के लिए जोड़े का आदेश दिया जाएगा ), कम से कम लंबाई के कम रन द्वारा अलग किया गया 2. कड़ाई से बढ़ते क्रम में ] एक बढ़ती हुई 3-तत्व अनुक्रम का हिस्सा बनने के लिए, वहाँ एक पहले तत्व होना चाहिए मैं ऐसा है कि एक [ मैं ] < एक [ जे ] या बाद के तत्व कश्मीर ऐसी है कि एक [ j + 1 ] < एक [ कश्मीरए [ जे ] < ए [ जे + १ ]मैंA [ i ] < A [ j ]क ।ए [ जे + 1 ] < ए [ के ]
मैंक
मैंजेकमैं
मैं( i , j )कi(i,j)(i,j)i′>jA[i′]<A[i]i′i(i,j)j′A[j′]<A[j](i′,j′)
एल्गोरिथ्म का कथन
पायथन सिंटैक्स में दिया गया है, लेकिन सावधान रहें कि मैंने इसका परीक्षण नहीं किया है।
def subsequence3(A):
"""Return the indices of a subsequence of length 3, or None if there is none."""
index1 = None; value1 = None
index2 = None; value2 = None
for i in range(0,len(A)):
if index1 == None or A[i] < value1:
index1 = i; value1 = A[i]
else if A[i] == value1: pass
else if index2 == None:
index2 = (index1, i); value2 = (value1, A[i])
else if A[i] < value2[1]:
index2[1] = i; value2[1] = A[i]
else if A[i] > value2[1]:
return (index2[0], index2[1], i)
return None
प्रमाण स्केच
index1
सरणी के उस हिस्से के न्यूनतम का सूचकांक है जिसे पहले से ही पता लगाया गया है (यदि यह कई बार होता है, तो हम पहली घटना को बनाए रखते हैं), या None
पहले तत्व को संसाधित करने से पहले। index2
सरणी के पहले से ही निकले हुए हिस्से में लंबाई 2 की बढ़ती हुई संख्या के सूचकांकों को संग्रहीत करता है जिसमें सबसे कम सबसे बड़ा तत्व होता है, या None
यदि ऐसा क्रम मौजूद नहीं है।
जब return (index2[0], index2[1], i)
चलता है, तो हमारे पास value2[0] < value[1]
(यह एक अपरिवर्तनीय है value2
) और value[1] < A[i]
(संदर्भ से स्पष्ट)। यदि लूप प्रारंभिक रिटर्न को आमंत्रित किए बिना समाप्त होता है, तो या तो value1 == None
, जिस स्थिति में लंबाई 2 की कोई बढ़ती हुई संख्या नहीं है, अकेले 3 को छोड़ दें, या value1
जिसमें लंबाई 2 की सबसे बड़ी तत्व है , जिसमें बाद की सबसे बड़ी तत्व है। बाद के मामले में, हमारे पास अपरिवर्तनीय रूप से यह है कि लंबाई की बढ़ती संख्या 3 की तुलना में पहले समाप्त नहीं होती है value1
; इसलिए इस तरह के किसी भी बाद के अंतिम तत्व, को जोड़ा जाता है value2
, जो लंबाई 3 की बढ़ती हुई बाद में बनेगा: क्योंकि हमारे पास भी अपरिवर्तनीय है जो value2
लंबाई के बढ़ते 3 का हिस्सा नहीं है, जो पहले से ही बने हुए हिस्से में समाहित हैं, पूरे ऐरे में ऐसा कोई परिणाम नहीं है।
उपर्युक्त आक्रमणकारियों को साबित करना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।
जटिलता
O(1)O(1)O(n)
औपचारिक प्रमाण
पाठक को एक अभ्यास के रूप में छोड़ दिया।