バイナリサーチ
問: ソートされた数値の配列と数値targetを受け取り、配列中のtargetのインデックスを求める。その際、バイナリサーチを用いること。
アルゴリズム実装 $O(\log n)$
配列の要素数をnとしたとき、left=0、right=nの変数を作る。また、leftとrightの中央の位置をmidとする。
array[mid] === targetならtargetが見つかったとして探索終了。left >= rightなら見つからなかったとして探索終了。array[mid] > targetならtargetは配列の左半分にあるので、right=mid-1として0へarray[mid] < targetならtargetは配列の右半分にあるので、left=mid+1として0へ
function binarySearch(array, target) { let left = 0 let right = array.length - 1 while (left <= right) { const mid = Math.floor((left + right) / 2) if (array[mid] > target) { right = mid - 1 } else if (array[mid] < target) { left = mid + 1 } else { return mid } } return -1 }
バイナリサーチは一回実行するごとに対象の配列の要素数が1/2になる。最悪の場合要素数が1になるまで実行されるので、計算量はその繰り返し回数をkとすると
底数を無視して、$O(\log n)$となる