実験のトピック:
[0:N-1]が設定され、良好な配列を有し、書き換えアレイの行であるバイナリサーチアルゴリズムを xが配列されていないとき、xの最大の要素の位置を返すようにすることは、私未満、位置の最小のJ Xの要素よりも大きいです。配列の要素を探し、iとjと同じ、両方の配列の位置x。
入力フォーマット:
2行を入力します。
最初の行は、n及びxの値であり、2行目は、それぞれ整数との間のスペースで区切られたn個の異なる整数、非降順です。
出力フォーマット:
添字jは最小X最大出力要素iはxの最小の要素よりも大きい最大屈折率よりも小さいです。配列の要素を検索する場合、i、jは同じ。ヒント:Xは、出力がフル値未満の場合:-1 0、xはすべての値よりも大きい場合、出力:N-1の値は、n個
問題の説明:
アレイ内のx位置を見つけるためにバイナリサーチアルゴリズムを書き換える、または(xは配列には存在しない)場合の間です。
アルゴリズムの説明:
他の特別な条件を排除するもので、アレイが2つのセクションに分割され、検索[i]は<X <[j]をアレイ周期は、これまでに見つかりました。
アルゴリズム分析の時間と空間の複雑さ:
最初のn個の要素、第2のn / 2の要素なので、N / 2 ^ k個の要素のk番目に比べあります。
時間計算量は、一般に、最悪の結果をとり、kは時間複雑性の尺度としてである
ので、N / 2 ^ k = 1、k = log2nを得るために、すなわち最悪の結果、最後の残りの1つの要素、時間計算量
O(LOGN)の程度。
各再帰補助空間に必要な再帰の深さの数*
空間の複雑さがあるように:O(N)
書式#include <iostreamの>
名前空間stdを使用。
([]、int型のx、int型N INT)INT検索{
; 0 =左のint 右int型= N-1;
int型のTF = 0;
int型I、J。
一方(左<=右){
INT中間=(左+右)/ 2。
もし(x == A [中央])
{
coutの<<真ん中<<」「<<ミドル<<てendl;
TF = 1。
ブレーク;
}
もし(x == A [0]){
裁判所未満<< "0" <<てendl;
TF = 1。
ブレーク;
}
もし(x == A [N-1])
{
COUT << N-1 <<」「<< N-1 << ENDL。
TF = 1。
ブレーク;
}
IF(X> [中間] && X <[N-1]){
IF(X <中間+ 1]){
coutの<<真ん中<<」「<<ミドル+ 1;
TF = 1。
ブレーク;}
}
左=中央+ 1。
IF(X <[中間] && X> [0]){
IF(X> [中間-1]){
coutの<<ミドル-1 <<」「<<真ん中。
TF = 1。
ブレーク;
}
右=中間-1;}
}
IF(TF == 0 && X <[0])COUT << " - 1 0" << ENDL。
IF(TF == 0 && X> [N-1])COUT << N-1 <<」「<< N << ENDL。
}
{int型のmain()
int型N、I、X;
[1000] int型。
CIN >> N >> X。
用(i = 0; iがn <; iは++)
CIN >> [i]は、
検索(X、N)
0を返します。
}
感情や経験:
バイナリ検索アルゴリズムは、大の可能性を書き換えたが、その途中-1または+1に注意することが最小限で最大の、左右の各リセット配列を検討します。