logo

التسلسل اللاحق المرتب بالحجم 3 في الزمن الخطي باستخدام الفضاء الثابت

بالنظر إلى مصفوفة، تكون المهمة هي العثور على ثلاثة عناصر من هذه المصفوفة بحيث تكون في شكل مرتبة، أي بالنسبة لأي ثلاثة عناصر a[i] a[j] وa[k] فإنها تتبع هذه العلاقة: أ[i]< a[j] < a[k] أين أنا< j < k . يجب حل هذه المشكلة باستخدام مساحة ثابتة أو لا توجد مساحة إضافية.

تم حل هذه المشكلة بالفعل في الوقت الخطي باستخدام الفضاء الخطي: ابحث عن تسلسل فرعي مصنف بالحجم 3 في التوقيت الخطي

خوارزميات البحث

أمثلة:  



  Input:   arr[] = {12 11 10 5 2 6 30}   Output:   5 6 30 or 2 6 30   Explanation:   Answer is 5 6 30 because 5 < 6 < 30 and they occur in this sequence in the array.   Input:   arr[] = {5 7 4 8}   Output:   5 7 8   Explanation:   Answer is 5 7 8 because 5 < 7 < 8 and they occur in the same sequence in the array 

حل: الهدف هو العثور على ثلاثة عناصر أ ب و ج مثل هذا أ< b < c ويجب أن تحدث العناصر بنفس التسلسل في المصفوفة.

يقترب: تتناول المشكلة إيجاد ثلاثة عناصر أ ب ج حيث أ< b < c and they must appear in the same order as in the array. So the intuition at any step must be followed as such. One of the variable (صغير) يجب تخزين أصغر عنصر في المصفوفة والمتغير الثاني كبير سيتم تعيين قيمة عندما تكون هناك بالفعل قيمة أصغر موجودة في ملف (صغير) عامل. سيؤدي ذلك إلى تكوين زوج من المتغيرين اللذين سيشكلان العنصرين الأولين من التسلسل المطلوب. وبالمثل، إذا كان من الممكن العثور على قيمة أخرى في المصفوفة التي تم تعيينها عندما تم تعيين المتغيرين الأولين بالفعل ولها قيمة أصغر من العنصر الحالي، فسيتم إكمال البحث عن القيمة الثالثة. وبهذا يكمل الثلاثي a b وc بحيث يكون a< b < c in similar sequence to the array.

تم فرز قائمة الصفيف

خوارزمية  

  1. إنشاء ثلاثة متغيرات صغير - يخزن أصغر العناصر كبير - يخزن العنصر الثاني من التسلسل أنا - عداد حلقة
  2. التحرك على طول مجموعة الإدخال من البداية حتى النهاية.
  3. إذا كان العنصر الحالي أصغر من أو يساوي المتغير صغير تحديث المتغير.
  4. وإلا إذا كان العنصر الحالي أصغر من أو يساوي المتغير كبير تحديث المتغير. حتى هنا نحصل على زوج (صغير كبير) في هذه اللحظة حيث صغير< large وتحدث بالتسلسل المطلوب.
  5. وإلا إذا فشلت الحالتين السابقتين في التطابق، قم بكسر الحلقة حيث حصلنا على زوج حيث يكون العنصر الحالي أكبر من كلا المتغيرين صغير و كبير . قم بتخزين الفهرس في متغير أنا .
  6. إذا لم تتم مواجهة عبارة Break، فمن المؤكد أنه لا يوجد مثل هذا الثلاثي.
  7. وإلا فإن هناك ثلاثية تفي بالمعايير ولكن المتغير صغير ربما تم تحديثها إلى قيمة أصغر جديدة.
  8. لذلك قم باجتياز المصفوفة من البداية إلى الفهرس i.
  9. إعادة تعيين المتغير صغير إلى أي عنصر أقل من كبير فمن المؤكد أن هناك واحد.
  10. طباعة القيم صغير كبير وعنصر الصفيف

تطبيق :

C++
// C/C++ program to find a sorted sub-sequence of // size 3 using constant space #include    using namespace std; // A function to fund a sorted sub-sequence of size 3 void find3Numbers(int arr[] int n) {  // Initializing small and large(second smaller)  // by INT_MAX  int small = INT_MAX large = INT_MAX;  int i;  for (i = 0; i < n; i++)  {  // Update small for smallest value of array  if (arr[i] <= small)  small = arr[i];  // Update large for second smallest value of  // array after occurrence of small  else if (arr[i] <= large)  large = arr[i];  // If we reach here we found 3 numbers in  // increasing order : small large and arr[i]  else  break;  }  if (i == n)  {  printf('No such triplet found');  return;  }  // last and second last will be same but first  // element can be updated retrieving first element  // by looping upto i  for (int j = 0; j <= i; j++)  {  if (arr[j] < large)  {  small = arr[j];  break;  }  }  printf('%d %d %d' small large arr[i]);  return; } // Driver program to test above function int main() {  int arr[] = {5 7 4 8};  int n = sizeof(arr)/sizeof(arr[0]);  find3Numbers(arr n);  return 0; } 
Java
// Java program to find a sorted subsequence of // size 3 using constant space class GFG {  // A function to fund a sorted subsequence of size 3  static void find3Numbers(int arr[] int n)  {  // Initializing small and large(second smaller)  // by INT_MAX  int small = +2147483647 large = +2147483647;  int i;  for (i = 0; i < n; i++)  {  // Update small for smallest value of array  if (arr[i] <= small)  small = arr[i];    // Update large for second smallest value of  // array after occurrence of small  else if (arr[i] <= large)  large = arr[i];    // If we reach here we found 3 numbers in  // increasing order : small large and arr[i]  else  break;  }    if (i == n)  {  System.out.print('No such triplet found');  return;  }    // last and second last will be same but first  // element can be updated retrieving first element  // by looping upto i  for (int j = 0; j <= i; j++)  {  if (arr[j] < large)  {  small = arr[j];  break;  }  }    System.out.print(small+' '+large+' '+arr[i]);  return;  }    // Driver program  public static void main(String arg[])  {  int arr[] = {5 7 4 8};  int n = arr.length;  find3Numbers(arr n);  } } // This code is contributed by Anant Agarwal. 
Python3
# Python3 program to find a sorted subsequence  # of size 3 using constant space # Function to fund a sorted subsequence of size 3 def find3Numbers(arr n): # Initializing small and large(second smaller) # by INT_MAX small = +2147483647 large = +2147483647 for i in range(n): # Update small for smallest value of array if (arr[i] <= small): small = arr[i] # Update large for second smallest value of # array after occurrence of small elif (arr[i] <= large): large = arr[i] # If we reach here we found 3 numbers in # increasing order : small large and arr[i] else: break if (i == n): print('No such triplet found') return # last and second last will be same but # first element can be updated retrieving  # first element by looping upto i for j in range(i + 1): if (arr[j] < large): small = arr[j] break print(small' 'large' 'arr[i]) return # Driver program arr= [5 7 4 8] n = len(arr) find3Numbers(arr n) # This code is contributed by Anant Agarwal. 
C#
// C# program to find a sorted sub-sequence of // size 3 using constant space using System; class GFG {    // A function to fund a sorted sub-sequence  // of size 3  static void find3Numbers(int []arr int n)  {    // Initializing small and large(second smaller)  // by INT_MAX  int small = +2147483647 large = +2147483647;  int i;  for (i = 0; i < n; i++)  {    // Update small for smallest value of array  if (arr[i] <= small)  small = arr[i];    // Update large for second smallest value of  // array after occurrence of small  else if (arr[i] <= large)  large = arr[i];    // If we reach here we found 3 numbers in  // increasing order : small large and arr[i]  else  break;  }    if (i == n)  {  Console.Write('No such triplet found');  return;  }    // last and second last will be same but first  // element can be updated retrieving first element  // by looping upto i  for (int j = 0; j <= i; j++)  {  if (arr[j] < large)  {  small = arr[j];  break;  }  }    Console.Write(small + ' ' + large + ' ' + arr[i]);  return;  }    // Driver program  public static void Main()  {  int []arr = {5 7 4 8};  int n = arr.Length;  find3Numbers(arr n);  } } <br> // This code is contributed by nitin mittal 
PHP
 // PHP program to find a sorted  // subsequence of size 3 using  // constant space // A function to fund a sorted // subsequence of size 3 function find3Numbers($arr $n) { // Initializing small and  // large(second smaller) // by INT_MAX $small = PHP_INT_MAX; $large = PHP_INT_MAX; $i; for($i = 0; $i < $n; $i++) { // Update small for smallest // value of array if ($arr[$i] <= $small) $small = $arr[$i]; // Update large for second // smallest value of after  // occurrence of small else if ($arr[$i] <= $large) $large = $arr[$i]; // If we reach here we  // found 3 numbers in // increasing order :  // small large and arr[i] else break; } if ($i == $n) { echo 'No such triplet found'; return; } // last and second last will // be same but first // element can be updated  // retrieving first element // by looping upto i for($j = 0; $j <= $i; $j++) { if ($arr[$j] < $large) { $small = $arr[$j]; break; } } echo $small' ' $large' ' $arr[$i]; return; } // Driver Code $arr = array(5 7 4 8); $n = count($arr); find3Numbers($arr $n); // This code is contributed by anuj_67. ?> 
JavaScript
<script>  // JavaScript program to find a  // sorted sub-sequence of  // size 3 using constant space    // A function to fund a sorted sub-sequence  // of size 3  function find3Numbers(arr n)  {    // Initializing small and large(second smaller)  // by INT_MAX  let small = +2147483647 large = +2147483647;  let i;  for (i = 0; i < n; i++)  {    // Update small for smallest value of array  if (arr[i] <= small)  small = arr[i];    // Update large for second smallest value of  // array after occurrence of small  else if (arr[i] <= large)  large = arr[i];    // If we reach here we found 3 numbers in  // increasing order : small large and arr[i]  else  break;  }    if (i == n)  {  document.write('No such triplet found');  return;  }    // last and second last will be same but first  // element can be updated retrieving first element  // by looping upto i  for (let j = 0; j <= i; j++)  {  if (arr[j] < large)  {  small = arr[j];  break;  }  }    document.write(small + ' ' + large + ' ' + arr[i]);  return;  }    let arr = [5 7 4 8];  let n = arr.length;  find3Numbers(arr n);   </script> 

الإخراج
5 7 8

تحليل التعقيد:  

    تعقيد الوقت: O(ن). 
    نظرًا لأن المصفوفة يتم اجتيازها مرتين فقط، فإن التعقيد الزمني هو يا(2*ن) وهو يساوي على) .تعقيد الفضاء: O(1). 
    وبما أنه يتم تخزين ثلاثة عناصر فقط، فإن تعقيد الفضاء ثابت أو يا(1) .