সেখানে একটা অ্যালগরিদম যা খুঁজে বের করে তিন আকারের subsequences অনুসারে বাছাই করা হয়


21

আমি একটি অ্যালগরিদমের অস্তিত্ব প্রমাণ করতে বা অস্বীকার করতে চাই যা পূর্ণসংখ্যার অ্যারে দেওয়া হ'ল এবং তিনটি সূচক খুঁজে পাই যে এবং রৈখিক সময়ে (বা এমন কোনও ট্রিপল নেই)।Ai,jki<j<kA[i]<A[j]<A[k]

এটি কোনও হোমওয়ার্কের প্রশ্ন নয়; আমি এটিকে একটি প্রোগ্রামিং ফোরামে দেখেছি "এই জাতীয় একটি অ্যালগরিদম বাস্তবায়নের চেষ্টা করুন" বলে ফ্রেমযুক্ত। আমি সন্দেহ করি যে এটি বিভিন্ন পরীক্ষার পরেও অসম্ভব। আমার স্বজ্ঞাততা আমাকে তাই বলে, কিন্তু এটি আসলে কোনও কিছুর জন্য গণনা করে না।

আমি এটি আনুষ্ঠানিকভাবে প্রমাণ করতে চাই। তুমি এটা কিভাবে কর? আমি আদর্শভাবে ধাপে ধাপে উত্থিত একটি প্রমাণ দেখতে চাই এবং তারপরে আপনি যদি এতো ঝোঁক হন তবে সাধারণভাবে এই জাতীয় প্রশ্নগুলি প্রমাণ / অস্বীকার করার বিষয়ে কীভাবে যাবেন তার কিছু ব্যাখ্যা। এটি যদি সহায়তা করে তবে কয়েকটি উদাহরণ:

[1,5,2,0,3] → (1,2,3)
[5,6,1,2,3] → (1,2,3)
[1,5,2,3] → (1,2,3)
[5,6,1,2,7] → (1,2,7)
[5,6,1,2,7,8] → (1,2,7)
[1,2,999,3] → (1,2,999)
[999,1,2,3] → (1,2,3)
[11,12,8,9,5,6,3,4,1,2,3] → (1,2,3)
[1,5,2,0,-5,-2,-1] → (-5,-2,-1)

আমার ধারণা ছিল যে কেউ উপরে পুনরাবৃত্তি করতে পারে , এবং প্রতিবারই একটি (আমাদের বর্তমান , এটি) থাকে, আমরা একটি নতুন ট্রিপল তৈরি করি এবং এটিকে অ্যারেতে ঠেলে দেই। আমাদের ত্রিপলগুলির মধ্যে একটি সম্পূর্ণ না হওয়া পর্যন্ত আমরা প্রতিটি ট্রিপল পদক্ষেপ এবং তুলনা চালিয়ে যাচ্ছি। সুতরাং এটি মত , ! তবে আমি মনে করি এটি কেবলমাত্র চেয়ে জটিল কারণ আমাদের ট্রিপল অ্যারেতে ট্রিপলের সংখ্যাটি সবচেয়ে খারাপ ক্ষেত্রে ইনপুট তালিকার আকারের সাথে মিলে যায়।Ai<jj[1,5,2,0,-5,-2,-1] → 1..2.. -5.. -2.. -1[1,5,2,0,-5,-2,3,-1] → 1..2.. -5.. -2.. 3O(n)



লক্ষ্য করুন সবচেয়ে খারাপ ক্ষেত্রে (সাজানো অ্যারে) মধ্যে আপনি এমনকি আছে অনেক উপযুক্ত triples। আপনি সিডো কোড হিসাবে প্রস্তাবিত অ্যালগরিদম প্রদান বিবেচনা করুন; আমার ধারণা আপনার ব্যাখ্যা সম্পূর্ণ হয়নি not Θ(এন3)
রাফেল

উত্তর:


14

এটি দীর্ঘতম ক্রমবর্ধমান উত্তরোত্তর সমস্যার বৈচিত্র ; এই দুটি সমাধান অ্যারে এবং পি ব্যবহার করে উইকিপিডিয়ায় উপস্থাপিত সমাধান :এমপি

  • - দোকানে অবস্থান ক্ষুদ্রতম মান একটি [ ] দৈর্ঘ্যের একটি ক্রমবর্ধমান subsequence আছে যেমন যে এ বিভক্তি একটি [ ] ব্যাপ্তির উপরআমি (নোট আমরা আছেআমি এখানে কারণ j ক্রমবর্ধমান অনুচ্ছেদের দৈর্ঘ্যের প্রতিনিধিত্ব করে, এবং কে এর সমাপ্তির অবস্থানকে উপস্থাপন করে Ob স্পষ্টতই, আমরা কখনই ১৩ -এর অবস্থানের শেষেরদৈর্ঘ্যের ১৩- এর দৈর্ঘ্য বাড়তে পারি না 11এম[]একজন[]একজন[]আমিআমি1311। সংজ্ঞা অনুসারে )।আমি
  • - দোকানে পূর্বসুরী অবস্থান একটি [ ] দীর্ঘতম বৃদ্ধি subsequence এ বিভক্তি মধ্যে একটি [ ]পি[]একজন[]একজন[]

    এছাড়াও অ্যালগরিদম এখন পর্যন্ত পাওয়া দীর্ঘতম বর্ধমান অনুচ্ছেদের দৈর্ঘ্যের প্রতিনিধিত্ব করে একটি পরিবর্তনশীল সঞ্চয় করে ।এল

এই অ্যালগরিদমটি সবচেয়ে খারাপ ক্ষেত্রে চলে । আপনার সমস্যাটি একটি বিশেষ ক্ষেত্রে যা আপনাকে এল = 3 যখন রানটাইমটিকে ( এন ) এর দিকে ধাক্কা দেয় তখন আপনাকে ফিরে আসতে দেয় কারণ বাইনারি অনুসন্ধান কেবলমাত্র দৈর্ঘ্যের অ্যারেগুলিতে দু'একটি চলতে থাকে, সুতরাং সময় O ( 1 ) এর বিপরীতে থাকে Case ( লগ এন ) সাধারণ ক্ষেত্রে।Θ(এনলগএন)এল=3হে(এন)হে(1)Θ(লগএন)

পরিবর্তিত সিউডো কোডটি বিবেচনা করুন:

 L = 0
 for i = 1, 2, ... n:
    binary search for the largest positive j ≤ L
      such that X[M[j]] < X[i] (or set j = 0 if no such value exists)
    P[i] = M[j]
    if j == L or X[i] < X[M[j+1]]:
       M[j+1] = i
       L = max(L, j+1)
   if L==3 : return true; // you can break here, and return true.
return false; // because L is smaller than 3.

@ সাeedদআমিরী আমি মন্তব্যটি দেখেছি তবে এখনও তা পর্যালোচনা করার মতো সময় আমার হাতে নেই (শুতে যাওয়ার আগে আমি প্রশ্নটি পোস্ট করেছি)। আমি আপনার লিঙ্কটি থেকে সন্দেহ করেছি যে আমাদের বিশেষ কেস এল = 3 কোনওভাবে সহায়তা করবে তবে বিশদটি বোঝার সুযোগ হয়নি। আমি বর্তমানে কর্মক্ষেত্রে এবং সময় সীমাবদ্ধ। আশ্বাস দিন যে আমি আপনার উত্তরটির প্রশংসা করি। এটির মধ্যে প্রতিটি লাইন সম্পূর্ণরূপে না বুঝে এটির জন্য আপনাকে ধন্যবাদ জানানো আমার পক্ষে পৃষ্ঠপোষক হবে।
ক্রিস্টোফার সম্পন্ন

@ সাeedদআমিরি: আমি সম্মত হই যে আপনি এখানে আরও "ফাঁক পূরণ" প্রত্যাশা করছেন, তবে আপনাকে কমপক্ষে প্রমাণের কোণার যুক্তি (যদিও স্কেচিযুক্ত) দিতে হবে। ওপি সম্পর্কিত, তিনি মনে করছেন যে তিনি ইতালি ভিত্তিক ছিলেন তাই সম্ভবত আপনার মন্তব্য এবং উত্তরের মধ্যে দ্রুত ঘুমিয়ে ছিলেন (এবং সম্ভবত তিনি এখন পূর্বের সাথে ব্যস্ত রয়েছেন)।
রাফেল

ক্রিস্টোফারডোন, আমি আপনাকে বিরক্ত করতে চাই না, দুঃখিত এটি আমার ভুল, আপনি অবশ্যই ঠিক বলেছেন।

+1 টি: চমত্কারভাবে এই সাধারণীকরণ, মাত্র এক পাস করে তোলে এবং হয় স্থান। হে(1)
আর্যভট্ট

ঠিক আছে, ভাল লাগছে। সাধারণ দীর্ঘতম ক্রমবর্ধমান ক্রম অ্যালগরিদমের আচরণটি করতে আমার কিছুটা সময় লেগেছে। এর পরে, সর্বোচ্চ দৈর্ঘ্য == 3 পরিবর্তন ঠিক আছে। ধন্যবাদ!
ক্রিস্টোফার সম্পন্ন 21

11

পদ্ধতি সম্পর্কে একটি নোট

আমি এই সমস্যাটি সম্পর্কে কিছুটা ভেবেছি, এবং একটি সমাধানে এসেছি। আমি যখন সা Saeedদ আমিরির উত্তর পড়লাম তখন বুঝতে পেরেছিলাম যে আমি যেটি এসেছি তা হ'ল দৈর্ঘ্যের ধারাবাহিকতায় অ্যালগরিদম সন্ধান করা প্রমিত দীর্ঘতম অনুচ্ছেদের একটি বিশেষ সংস্করণ I'm আমি সমাধানটি যেভাবে এসেছি তা পোস্ট করছি, কারণ আমি মনে করি সমস্যা সমাধানের একটি আকর্ষণীয় উদাহরণ।

দ্বিমূলক সংস্করণ

আসুন ছোট শুরু করা যাক: উপাদানগুলি ক্রমে তিনটি সূচক সন্ধান করার পরিবর্তে আসুন দুটি অনুসন্ধান করা যাক: যেমন [ i ] < [ জে ]i<jA[i]<A[j]

যদি হ্রাস পাচ্ছে (যেমন i < j , A [ i ] A [ j ] , বা সমানভাবে i , A [ i ] A [ i + 1 ] ), তবে এরকম সূচকগুলি নেই। তা না হলে, একটি সূচক আমি যেমন যে একজন [ আমি ] < একটি [ আমি + 1 ]Ai<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+m1])

আমরা কেবল দেখেছি যে অনুরোধ সূচকগুলি সর্বদা উপস্থিত থাকে না। সূচকের অস্তিত্ব নেই যখন আমাদের কৌশল অধ্যয়ন করা হবে। আমরা সূচকগুলি সন্ধানের চেষ্টা করছি এবং আমাদের অনুসন্ধান কীভাবে ভুল হতে পারে তা দেখে আমরা এটি করব। তারপরে অনুসন্ধানগুলি ভুল হয় না এমন কেসগুলি সূচকগুলি সন্ধানের জন্য একটি অ্যালগরিদম সরবরাহ করবে।

4,3,2,1,0

দুটি সূচক সহ, আমরা একটানা সূচকগুলি খুঁজে পেতে পারি। তিনটি সূচক সহ আমরা এবং k = j + 1 নিয়ে আসতে পারব না । তবে, আমরা যখন কেসটিকে সমাধান করার জন্য তিনটি কঠোর বর্ধমান উপাদান ( [ আই ] < [ আই + 1 ] < [ আই + ] ) চালানো হয় তখন আমরা কেসটি বিবেচনা করতে পারি, কারণ এই জাতীয় রানগুলি সনাক্ত করা সহজ, এবং দেখুন কিভাবে এই শর্তটি পূরণ করা যায় না। মনে করুন যে অনুক্রমের দৈর্ঘ্য 3 এর কোনও কঠোরভাবে বৃদ্ধি নেই।j=i+1k=j+1A[i]<A[i+1]<A[i+2]

4,3,2,1,2,3,2,1,0

ক্রম শুধুমাত্র কঠোরভাবে দৈর্ঘ্য 2 (যা আমি ডাকবো এর রান বৃদ্ধি করেছে আদেশ জোড়া একটি কঠোরভাবে বৃদ্ধি চালানোর জন্য সংক্ষেপে) জন্য অন্তত 2 এ দৈর্ঘ্যের হ্রাসকারী রানে বিচ্ছিন্ন ক্রমবর্ধমান 3-উপাদান ক্রমের অংশ হতে, আমি অবশ্যই পূর্ববর্তী উপাদান থাকতে হবে যেমন A [ i ] < [ জে ] বা পরবর্তী উপাদান K যেমন A [ জে + 1 ] < [ কেA[j]<A[j+1]iA[i]<A[j]kA[j+1]<A[k]

4,3,2,2.5,1.5,0.5,1,0

যখন প্রতিটি অর্ডারযুক্ত জোড় পরেরটির চেয়ে সম্পূর্ণ কম হয় তখন বা কে না উভয়ই উপস্থিত থাকে A এটি সমস্ত কিছু নয়: যখন জোড়াগুলি আন্তঃবিযুক্ত হয়, তখন আমাদের আরও সূক্ষ্মভাবে তুলনা করা দরকার।ik

3,2,1,3.5,2.5,1.5,0.5, -0.5,1.25, -0,25 3,2,1,2.5,1.5,0.5,2,1,0

বামদিকের উপাদান একটি ক্রমবর্ধমান subsequence প্রথম আসা এবং ছোট হতে হবে। পরবর্তী উপাদান বৃহত্তর করা প্রয়োজন, কিন্তু কম যতটা সম্ভব একটি তৃতীয় বৃহত্তর উপাদান খুঁজে পাবে । প্রথম উপাদানটি আমি ক্রমানুসারে সর্বদা ক্ষুদ্রতম উপাদান না, এবং এটি সর্বদা প্রথম নয় যার জন্য পরবর্তী বৃহত্তর উপাদান থাকে - হয় মাঝে মাঝে আরও নীচের 2-উপাদান উপসর্গ থাকে এবং কখনও কখনও আরও ভাল থাকে ইতিমধ্যে পাওয়া সর্বনিম্ন জন্য ফিট।ijki

2.1,3,2,1,2.5,1.5,0.5,2,1,0 1,2,0,2.5,1.5,0.5

বাম থেকে ডানে যেতে, আমরা ক্ষণস্থায়ীভাবে হিসাবে ছোটতম উপাদানটি বেছে নিই । যদি আমরা আরও ডানদিকে আরও বড় উপাদান পাই তবে আমরা এই জোড়টিকে টেন্টিভেটিভ হিসাবে বেছে নিই ( i , j ) । আমরা যদি আরও বড় কে খুঁজে পাই তবে আমরা জিতেছি। নোটটিতে কী জিনিস আমাদের পিক যে আমি এবং আমাদের পিক ( আমি , ) স্বাধীনভাবে আপডেট করা হয়: যদি আমরা একটি প্রার্থী আছে ( আমি , ) এবং আমরা এটি আমি ' > যেমন যে একজন [ আমি ' ] < একটি [i(i,j)ki(i,j)(i,j)i>j , আমি ' পরবর্তী প্রার্থী হয়ে আমি কিন্তু ( আমি , ) দেহাবশেষ। শুধু যদি আমরা খুঁজে' যেমন যে একজন [ ' ] < একটি [ ] হবে ( আমি ' , ' ) নতুন প্রার্থী যুগল হয়ে।A[i]<A[i]ii(i,j)jA[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)

আনুষ্ঠানিক প্রমাণ

পাঠকের কাছে অনুশীলন হিসাবে রেখেছি।


8

O(n)O(n)

প্রথমে অ্যারের বাম থেকে ডানদিকে স্ট্যাক এবং একটি সহায়ক অ্যারেটি অতিক্রম করুন যা আপনাকে প্রতিটি উপাদান, তার থেকেও বেশি এবং এর ডানদিকে একটি উপাদানের সূচক বলে দেয়।

1

প্রতিবার আপনি অ্যারেতে একটি নতুন উপাদান বিবেচনা করুন, যদি সেই উপাদানটি স্ট্যাকের শীর্ষ উপাদানগুলির চেয়ে বড় হয়, আপনি এটি স্ট্যাকটি পপ করে রেখেছেন এবং নতুন অলেক্সের সূচকটি শীর্ষের সাথে সংশ্লিষ্ট অক্স অ্যারের উপাদানটিকে নীচে রেখেছেন বিবেচনা।

বর্তমান উপাদানটি আরও বেশি থাকাকালীন উপাদানগুলি স্ট্যাকের বাইরে বের করা এবং সংশ্লিষ্ট সূচকটি সেট করা চালিয়ে যান। একবার শীর্ষে কোনও উপাদান থাকে যা কম নয় (বা খালি হয়ে যায়), বর্তমান উপাদানটিকে স্ট্যাকের উপরে চাপুন এবং উপরের পদক্ষেপটি পুনরাবৃত্তি করে অ্যারের পরবর্তী উপাদানটিতে যান।

অন্য পাস (এবং অন্য একটি অ্যারে অ্যারে) করুন, তবে ডান থেকে বামে যাচ্ছেন।

1

O(n)

ki

প্রথম পাসের জন্য সিউডো কোডটি দেখতে এই জাতীয় দেখাচ্ছে:

Stack <Pair<Elem, Index>> greats;
Elem auxArr[inputArr.Length];

for (Index i = 0; i < inputArr.Length; i++) {

    while (!greats.IsEmpty() && inputArr[i] > greats.PeekTop().Elem) {
        Pair top = greats.Pop();
        auxArr[top.Index] = i;
    }

    Pair p;
    p.Elem = inputArr[i];
    p.Index = i;

    greats.Push(p);
}

"যেহেতু আপনি অ্যারের প্রতিটি উপাদানকে কেবলমাত্র একটি অবিচ্ছিন্ন সংখ্যা হিসাবে বিবেচনা করেন, এটি ও (এন) সময়” "ওহ, ক্রামস। কোনওভাবেই আমি একাধিক ধ্রুবক পাসগুলি বাতিল করে দিয়েছিলাম, এটিকে ও (এন) হিসাবে না এড়িয়ে চলেছি। অতন্ত বেকুব. আমি আপনার ব্যাখ্যার জন্য কৃতজ্ঞ, এবং আমি এটি আবার সমাধান করার জন্য আবার চেষ্টা করব।
ক্রিস্টোফার সম্পন্ন 10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.