C ++ STLのバイナリ検索関数(binary_search、lower_bound、upper_bound)
バイナリ検索は、要素を配列の中央の値と比較し、値に基づいて分割することによって要素を検索する検索アルゴリズムです。アルゴリズムは、要素が見つかるまでこれを繰り返し実行します。
二分探索を適用するには、配列を並べ替える必要があります。
二分探索の時間計算量は対数です 注文。そのため、プログラマーは、アルゴリズムのコーディング時間を短縮するために、その実装とともにバイナリ検索にも関連する速記を知ることが非常に重要です。ここでは、標準テンプレートライブラリ(STL)に含まれる二分探索アルゴリズムに関連する関数について説明します。
下界と下界 −下限検索は、要素が見つかった位置を返します。
構文
lower_bound(start_pointer , end_pointer, element )
ここで
start_pointer 検索構造の開始点のメモリ位置を保持するポインタです。
end_pointer 検索構造のエンドポイントのメモリ位置を保持するポインタです。
要素 関数を使用して検出される要素です。
要素が構造体に1回出現すると、位置が返されます。
要素が構造内で複数回出現する場合、最初の要素の位置が返されます。
要素が構造体に存在しない場合、要素より次に大きい番号の位置が返されます。
インデックス 任意の要素のは、構造の基本位置を引くことによって求められます。
例
#include<bits/stdc++.h> using namespace std; int main(){ vector<int> sortedarray = {2 , 5, 7, 8 , 15, 20 }; vector<int> sortedarray2 = {2, 3, 4, 6 , 9 , 23 }; vector<int> sortedarray3 = {2 , 5, 7, 7 , 15, 20 }; cout<<"The position of element 7 found using lower_bound function :"; cout<<"\nCase 1 : When element is present in array but only once "; cout<<lower_bound(sortedarray.begin() , sortedarray.end(), 7) - sortedarray.begin(); cout<<"\nCase 2 : When element is present more than one times in the array "; cout<<lower_bound(sortedarray3.begin() , sortedarray3.end(), 7) - sortedarray3.begin(); cout<<"\nCase 3 : When element is not present in the array "; cout<<lower_bound(sortedarray2.begin() , sortedarray2.end(), 7) - sortedarray2.begin(); }
出力
The position of element 7 found using lower_bound function : Case 1 : When element is present in array but only once 2 Case 2 : When element is present more than one times in the array 2 Case 3 : When element is not present in the array 4
上界と下界 −上限検索は、渡された要素よりも高い要素の位置を返します。
構文
upper_bound(start_pointer , end_pointer, element)
ここで
start_pointer 検索構造の開始点のメモリ位置を保持するポインタです。
end_pointer 検索構造のエンドポイントのメモリ位置を保持するポインタです。
要素 関数を使用して検出される要素です。
この関数は、値が要素の値よりも大きい要素のインデックスを返します。
要素が構造内で1回出現した場合、次に高い要素の位置が返されます。
要素が構造内で複数回出現する場合、最後の要素の次の要素の位置が返されます。
要素が構造体に存在しない場合、要素より次に大きい番号の位置が返されます。
インデックス 任意の要素のは、構造の基本位置を引くことによって求められます。
例
#include<bits/stdc++.h> using namespace std; int main(){ vector<int> sortedarray = {2 , 5, 7, 8 , 15, 20 }; vector<int> sortedarray2 = {2, 3, 4, 6 , 9 , 23 }; vector<int> sortedarray3 = {2 , 5, 7, 7 , 15, 20 }; cout<<"The position of element 7 found using upper_bound function :"; cout<<"\nCase 1 : When element is present in array but only once "; cout<<upper_bound(sortedarray.begin() , sortedarray.end(), 7) - sortedarray.begin(); cout<<"\nCase 2 : When element is present more than one times in the array "; cout<<upper_bound(sortedarray3.begin() , sortedarray3.end(), 7) - sortedarray3.begin(); cout<<"\nCase 3 : When element is not present in the array "; cout<<upper_bound(sortedarray2.begin() , sortedarray2.end(), 7) - sortedarray2.begin(); }
出力
The position of element 7 found using upper_bound function : Case 1 : When element is present in array but only once 3 Case 2 : When element is present more than one times in the array 4 Case 3 : When element is not present in the array 4
binary_search 要素が構造体に存在するかどうかをチェックする関数です。
構文
binary_search(start_pointer , end_pointer, element)
ここで
start_pointer 検索構造の開始点のメモリ位置を保持するポインタです。
end_pointer 検索構造のエンドポイントのメモリ位置を保持するポインタです。
要素 関数を使用して検出される要素です。
要素が構造体に存在する場合、関数はtrueを返します。それ以外の場合は、falseを返します。
例
#include<bits/stdc++.h> using namespace std; int main(){ vector<int> sortedarray = {6, 15, 21, 27, 39, 42}; cout<<"The element to be found in the array is 21\n" ; if(binary_search(sortedarray.begin(), sortedarray.end(), 21)) cout<<"The element is found"; else cout<<"The element is not found"; cout<<"\nThe element to be found in the array is 5\n" ; if(binary_search(sortedarray.begin(), sortedarray.end(), 5)) cout<<"The element is found"; else cout<<"The element is not found"; }
出力
The element to be found in the array is 21 The element is found The element to be found in the array is 5 The element is not found
-
C++のユニークな二分探索木
整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を数える必要があります。したがって、入力が3の場合、ツリーは– になるため、出力は5になります。 これを解決するには、次の手順に従います– サイズn+1の配列を1つ作成します dp [0]:=1 for i:=1からn for j:=0 to i – 1 dp [i]:=dp [i] +(dp [i – 1 – j] * dp [j]) return dp [n] 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h
-
C ++プログラムでの二分探索?
二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要