পদ্ধতি সম্পর্কে একটি নোট
আমি এই সমস্যাটি সম্পর্কে কিছুটা ভেবেছি, এবং একটি সমাধানে এসেছি। আমি যখন সা Saeedদ আমিরির উত্তর পড়লাম তখন বুঝতে পেরেছিলাম যে আমি যেটি এসেছি তা হ'ল দৈর্ঘ্যের ধারাবাহিকতায় অ্যালগরিদম সন্ধান করা প্রমিত দীর্ঘতম অনুচ্ছেদের একটি বিশেষ সংস্করণ I'm আমি সমাধানটি যেভাবে এসেছি তা পোস্ট করছি, কারণ আমি মনে করি সমস্যা সমাধানের একটি আকর্ষণীয় উদাহরণ।
দ্বিমূলক সংস্করণ
আসুন ছোট শুরু করা যাক: উপাদানগুলি ক্রমে তিনটি সূচক সন্ধান করার পরিবর্তে আসুন দুটি অনুসন্ধান করা যাক: যেমন এ [ i ] < এ [ জে ] ।i<jA[i]<A[j]
যদি হ্রাস পাচ্ছে (যেমন ∀ i < j , A [ i ] ≥ A [ j ] , বা সমানভাবে ∀ i , A [ i ] ≥ A [ i + 1 ] ), তবে এরকম সূচকগুলি নেই। তা না হলে, একটি সূচক আমি যেমন যে একজন [ আমি ] < একটি [ আমি + 1 ] ।A∀i<j,A[i]≥A[j]∀i,A[i]≥A[i+1]iA[i]<A[i+1]
এই ক্ষেত্রে খুব সহজ; আমরা এটি সাধারণ করার চেষ্টা করব এটি দেখায় যে হিসাবে বর্ণিত সমস্যা সমাধানযোগ্য নয়: অনুরোধ সূচকগুলি সর্বদা উপস্থিত থাকে না। সুতরাং আমরা বরং জিজ্ঞাসা করব যে অ্যালগরিদম হয় বৈধ সূচকগুলি উপস্থিত থাকে, যদি সেগুলির উপস্থিত থাকে, বা সঠিকভাবে দাবি করে যে এই জাতীয় সূচকগুলি নেই।
এলগরিদম নিয়ে আসছেন
আমি শব্দ ব্যবহার করবে subsequence অ্যারে থেকে একটি নির্যাস মানে সূচকের গঠিত যে পরপর নাও হতে পারে ( ( একটি [ আমি 1 ] , ... , একটি [ আমি আছি ] ) সঙ্গে আমি 1 < ⋯ < আমি আছি ), এবং রান এ ( ( এ [ আমি ] , এ [ আমি + ১ ] , ... , এ এর একটানা উপাদান বোঝাতে চাইছি [A(A[i1],…,A[im])i1<⋯<imA )।(A[i],A[i+1],…,A[i+m−1])
আমরা কেবল দেখেছি যে অনুরোধ সূচকগুলি সর্বদা উপস্থিত থাকে না। সূচকের অস্তিত্ব নেই যখন আমাদের কৌশল অধ্যয়ন করা হবে। আমরা সূচকগুলি সন্ধানের চেষ্টা করছি এবং আমাদের অনুসন্ধান কীভাবে ভুল হতে পারে তা দেখে আমরা এটি করব। তারপরে অনুসন্ধানগুলি ভুল হয় না এমন কেসগুলি সূচকগুলি সন্ধানের জন্য একটি অ্যালগরিদম সরবরাহ করবে।
দুটি সূচক সহ, আমরা একটানা সূচকগুলি খুঁজে পেতে পারি। তিনটি সূচক সহ আমরা এবং k = j + 1 নিয়ে আসতে পারব না । তবে, আমরা যখন কেসটিকে সমাধান করার জন্য তিনটি কঠোর বর্ধমান উপাদান ( এ [ আই ] < এ [ আই + 1 ] < এ [ আই + ২ ] ) চালানো হয় তখন আমরা কেসটি বিবেচনা করতে পারি, কারণ এই জাতীয় রানগুলি সনাক্ত করা সহজ, এবং দেখুন কিভাবে এই শর্তটি পূরণ করা যায় না। মনে করুন যে অনুক্রমের দৈর্ঘ্য 3 এর কোনও কঠোরভাবে বৃদ্ধি নেই।j=i+1k=j+1A[i]<A[i+1]<A[i+2]
ক্রম শুধুমাত্র কঠোরভাবে দৈর্ঘ্য 2 (যা আমি ডাকবো এর রান বৃদ্ধি করেছে আদেশ জোড়া একটি কঠোরভাবে বৃদ্ধি চালানোর জন্য সংক্ষেপে) জন্য অন্তত 2 এ দৈর্ঘ্যের হ্রাসকারী রানে বিচ্ছিন্ন ক্রমবর্ধমান 3-উপাদান ক্রমের অংশ হতে, আমি অবশ্যই পূর্ববর্তী উপাদান থাকতে হবে যেমন A [ i ] < এ [ জে ] বা পরবর্তী উপাদান K যেমন A [ জে + 1 ] < এ [ কেA[j]<A[j+1]iA[i]<A[j]k ।A[j+1]<A[k]
যখন প্রতিটি অর্ডারযুক্ত জোড় পরেরটির চেয়ে সম্পূর্ণ কম হয় তখন বা কে না উভয়ই উপস্থিত থাকে A এটি সমস্ত কিছু নয়: যখন জোড়াগুলি আন্তঃবিযুক্ত হয়, তখন আমাদের আরও সূক্ষ্মভাবে তুলনা করা দরকার।ik
বামদিকের উপাদান একটি ক্রমবর্ধমান subsequence প্রথম আসা এবং ছোট হতে হবে। পরবর্তী উপাদান ঞ বৃহত্তর করা প্রয়োজন, কিন্তু কম যতটা সম্ভব একটি তৃতীয় বৃহত্তর উপাদান খুঁজে পাবে ট । প্রথম উপাদানটি আমি ক্রমানুসারে সর্বদা ক্ষুদ্রতম উপাদান না, এবং এটি সর্বদা প্রথম নয় যার জন্য পরবর্তী বৃহত্তর উপাদান থাকে - হয় মাঝে মাঝে আরও নীচের 2-উপাদান উপসর্গ থাকে এবং কখনও কখনও আরও ভাল থাকে ইতিমধ্যে পাওয়া সর্বনিম্ন জন্য ফিট।ijki
বাম থেকে ডানে যেতে, আমরা ক্ষণস্থায়ীভাবে হিসাবে ছোটতম উপাদানটি বেছে নিই । যদি আমরা আরও ডানদিকে আরও বড় উপাদান পাই তবে আমরা এই জোড়টিকে টেন্টিভেটিভ হিসাবে বেছে নিই ( i , j ) । আমরা যদি আরও বড় কে খুঁজে পাই তবে আমরা জিতেছি। নোটটিতে কী জিনিস আমাদের পিক যে আমি এবং আমাদের পিক ( আমি , ঞ ) স্বাধীনভাবে আপডেট করা হয়: যদি আমরা একটি প্রার্থী আছে ( আমি , ঞ ) এবং আমরা এটি আমি ' > ঞ যেমন যে একজন [ আমি ' ] < একটি [i(i,j)ki(i,j)(i,j)i′>j , আমি ' পরবর্তী প্রার্থী হয়ে আমি কিন্তু ( আমি , ঞ ) দেহাবশেষ। শুধু যদি আমরা খুঁজে ঞ ' যেমন যে একজন [ ঞ ' ] < একটি [ ঞ ] হবে ( আমি ' , ঞ ' ) নতুন প্রার্থী যুগল হয়ে।A[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 বর্ধমান অনুপাত রয়েছে qu পরবর্তী ক্ষেত্রে, আমরা আরও অবিস্মরণীয় যে 3 দৈর্ঘ্যের কোন ক্রমবর্ধমান অনুবর্তন 3 এর আগে শেষ হয় না value1
; সুতরাং এর সাথে যুক্ত হওয়া এ জাতীয় কোনও অনুচ্ছেদের সর্বশেষ উপাদানটি value2
দৈর্ঘ্য 3 এর ক্রমবর্ধমান অনুপাত গঠন করবে: যেমন আমাদের কাছেও আক্রমণাত্মক value2
রয়েছে যা অ্যারের ইতিমধ্যে ট্র্যাভারসড অংশে থাকা দৈর্ঘ্যের 3 এর ক্রমবর্ধমান অনুচ্ছেদের অংশ নয়, সেখানে পুরো অ্যারেতে এ জাতীয় কোনও অনুচ্ছেদ নেই।
পূর্বোক্ত আক্রমণকারীদের প্রমাণ করা পাঠকের পক্ষে অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে।
জটিলতা
O(1)O(1)O(n)
আনুষ্ঠানিক প্রমাণ
পাঠকের কাছে অনুশীলন হিসাবে রেখেছি।