C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

二分探索アプローチを使用して最大サブアレイ合計を見つけるC++プログラム


二分探索は、実行時の複雑さがΟ(log n)の高速検索アルゴリズムです。この検索アルゴリズムは、分割統治の原則に基づいて機能します。このアルゴリズムが正しく機能するためには、データ収集がソートされた形式である必要があります。

バイナリ検索は、コレクションの真ん中のアイテムを比較することによって特定のアイテムを検索します。一致する場合は、アイテムのインデックスが返されます。中央のアイテムがアイテムよりも大きい場合、そのアイテムは中央のアイテムの左側にあるサブ配列で検索されます。それ以外の場合、アイテムは中央のアイテムの右側のサブ配列で検索されます。このプロセスは、サブアレイのサイズがゼロになるまでサブアレイでも続行されます。

これは、二分探索アプローチを使用して最大サブアレイ合計を見つけるプログラムです。

アルゴリズム

Begin
   Declare an integer function maximum() to find the maximum of two integers.
   Declare val1, val2 to the integer datatype.
   Pass them as parameter.
   Check the maximum between val1 and val2.
   Return the maximum value.
End
Begin
   Declare an integer function MCS() to find the maximum sum sub-array which includes medium of the sub-array.
   Declare an array array[] and variable l, m, h to the integer datatype.
   Pass them as parameter.
   Declare variable s, sum_of_left_part to the integer datatype.
      Initialize s = 0.
      Initialize sum_of_left_part = -1.
   for (int i = m; i >= l; i--)
      s = s + array[i].
   if (s > sum_of_left_part) then
      sum_of_left_part = s.
      s = 0
   Declare variable sum_of_right_part to the integer datatype.
      Initialize sum_of_right_part = -1.
   for (int i = m+1; i <= h; i++)
      s = s + array[i].
   if (s > sum_of_right_part) then
      sum_of_right_part = s.
   return sum_of_left_part + sum_of_right_part.
End
Begin
   Declare an integer function MaximumSum_of_SubArray().
   Declare an array array[] and variable l, h to the integer datatype.
      Pass them as parameter.
   Declare m to the integer datatype.
   if (l == h) then
      return array[l].
   m = (l + h)/2;
   return maximum(maximum(MaximumSum_of_SubArray(array, l, m), MaximumSum_of_SubArray(array, m+1, h)), MCS(array, l, m, h)).
   Declare number_of_elements and i to the integer datatype.
   Print “Enter the number of elements of array: ”.
   Enter the value of number_of_elements.
   Declare an array a[number_of_elements] to the integer datatype.
   for(i = 0; i < n; i++)
      Print “Enter the element of”.
      Enter the data element of array.
   Print “Maximum sum of Sub-Array is: ” .
      Print the result of MaximumSum_of_SubArray(a, 0, n-1).
End.

#include<iostream>
using namespace std;
int maximum(int val1, int val2) // find the maximum of two integers {
   return (val1 > val2)? val1:val2;
}
int MCS(int array[], int l, int m, int h) // find the maximum sum sub-array which includes medium of the sub-array. {
   int s = 0;
   int sum_of_left_part = -1;
   for (int i = m; i >= l; i--) {
      s = s + array[i];
      if (s > sum_of_left_part)
         sum_of_left_part = s;
   }
   s = 0;
   int sum_of_right_part = -1;
   for (int i = m+1; i <= h; i++) {
      s = s + array[i];
      if (s > sum_of_right_part)
         sum_of_right_part = s;
   }
   return sum_of_left_part + sum_of_right_part; // Return sum of elements on left and right of medium.
}
int MaximumSum_of_SubArray(int array[], int l, int h) {
   int m;
   if (l == h)
      return array[l];
   m = (l + h)/2;
   return maximum(maximum(MaximumSum_of_SubArray(array, l, m), MaximumSum_of_SubArray(array, m+1, h)), MCS(array, l, m, h));
}
int main() {
   int number_of_elements, i;
   cout<<"Enter the number of elements of array: ";
   cin>> number_of_elements;
   cout<<endl;
   int a[number_of_elements];
   for(i = 0; i < number_of_elements; i++) {
      cout<<"Enter the element of "<<i+1<<": ";
      cin>>a[i];
   }
   cout<<"\nMaximum sum of Sub-Array is: "<<MaximumSum_of_SubArray(a, 0, number_of_elements -1); // Print the maximum sum sub-array.
   return 0;
}

出力

Enter the number of elements of array: 5

Enter the element of 1: 12
Enter the element of 2: 45
Enter the element of 3: 56
Enter the element of 4: 48
Enter the element of 5: 75

Maximum sum of Sub-Array is: 236

  1. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace

  2. 二分探索を使用して配列内の最大要素を検索するC++プログラム

    これは、二分探索木を使用して配列の最大要素を見つけるためのC++プログラムです。このプログラムの時間計算量はO(log(n))です。 アルゴリズム Begin Construct the Binary Search Tree using the given data elements. Next traverse the root pointer to the rightmost child node available. Print the data part of the node as the maximum data element of the given data