SEARCH A SORTED ARRAY FOR A[i] = i
Suppose that in addition to being sorted, the entries of A are distinct integers. Design an efficient algorithm for finding an index i such that A[i] = i or indicating that no such index exists.
( 出典: algorithms for interviews )
ヒント
sorted arrayときたらまずとりあえず考えるのは?
distinct integers, つまり重複無しのソート済み配列である.
答え
重複無しのソート済み配列とのこと.昇順であると仮定すれば以下が成り立つ
S[i] > S[i-1]
私の解答は以下の通り.
ロジックとはしては調べたいインデックスを2分木で絞り込む.調べたい値targetと2分木の中央要素v.at(mid)が等価ならばそのインデックスを返し,2分木探索終了時まで見つからなければ問題の指示通り-1を返す.
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
#define INTARRAY_MAX 10
int search(vector<pair<int,int>> v, int target) {
int st = 0;
int end = v.size() - 1;
int mid;
while( st < end ) {
mid = (st + end) / 2;
cout << st << ',' << end << ',' << mid << ',' << v.at(mid).second << endl;
if( v.at(mid).second == target )
return mid;
else if( v.at(mid).second > target )
end = mid - 1;
else
st = mid + 1;
}
return -1;
}
int main() {
vector<pair<int,int>> v;
int arrVal[] = { 0,1,3,15,18,26,38,45,50,62};
for( int i = 0;i < INTARRAY_MAX;i++ )
v.push_back(make_pair(i, arrVal[i] ));
cout << "find? " << search(v, 1) << endl;
cout << "find? " << search(v, 5) << endl;
return EXIT_SUCCESS;
}
プログラムを走らせると以下のようなアウトプットを得る.
0,9,4,18 0,3,1,1 find? 1 0,9,4,18 0,3,1,1 2,3,2,3 find? -1O(log2N)の平均又は最悪計算量で終えることできるのでデータ量が多くても大丈夫.(最もここではソートのコストは考慮に入れていない.)
ちなみにutilityヘッダはSTLのpairを使用する為に必要.
0 件のコメント:
コメントを投稿