Skip to content

Instantly share code, notes, and snippets.

@timakin
Created March 4, 2015 09:36
Show Gist options
  • Save timakin/dd4fdf71801d5a7d2617 to your computer and use it in GitHub Desktop.
Save timakin/dd4fdf71801d5a7d2617 to your computer and use it in GitHub Desktop.
文系が学ぶコンピューターサイエンス╭( ・ㅂ・)و ̑̑:第8回【リニアサーチ、バイナリサーチ】 ref: http://qiita.com/timakin/items/f4121db6f7dadb0472c2
// バイナリサーチ(2分探索)
// 基準点の前後を分けて探ることで、計算量をO(logN)に抑えることができる。
// バイナリサーチはあたいの大小を元に捜索するため、対象がソート済みの配列でなくてはならない。
binarySearch: function(data, target) {
var left = 0,
right = data.length - 1,
middle;
while(left <= right) {
// 基準点を毎回更新する。
// これより大きいか小さいかで、前後のどちら半分の配列を探索するか決める
// mid = Math.floor((left + right) / 2); // 通常の基準点の決め方
mid = ((left+right) >> 1); // ビット演算子で右シフトすれば半分になる。これでおよそ倍速。
// 基準点以上のどこかに探したい値がある
// 基準点との大小関係を元に配列を分割するので、
// そもそもソート済みじゃないと、分割する意味がないので注意。
if (data[mid] < target) {
left = mid + 1;
// 基準点以下のどこかに探したい値がある
} else if (data[mid] > target) {
right = mid - 1;
} else {
// もしleftとrightが一致したら、目当てのものがみつかったので終了。
return mid;
}
}
// 見つからなかったら-1を返す。
return -1;
}
linearSearch: function(data, target) {
// 先頭から一直線に、一致する引数を探して行って、
// もし一致するものがない場合は-1を返す。
for(item in data) {
if(target === data[item]) {
return item;
}
}
return -1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment