Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

二分探索

二分探索(binary search) はソート済みのリストや配列のデータにおける検索で、検索したい値が中央の値より大きいかどうかで検索範囲を半分ずつに絞り込んでいく

計算量はO(log⁡N)O(\log N):1回探索するごとに探索範囲が半分ずつになっていくので要素数NNに対し N=2kN=2^k回の計算で済む→k=log⁡2Nk=\log_2 N

7

関連:bisectパッケージ

Pythonの標準パッケージ bisect は二分探索で実装されている

bisect --- 配列二分法アルゴリズム

主な関数

ソート済みlist a に対し、 値 x が挿入されるべき位置の左端/右端のインデックスが得られる

関数説明
bisect_left(a, x)x を挿入すべき最左のインデックスを返す(x と等しい値がある場合はその左側)
bisect_right(a, x)x を挿入すべき最右のインデックスを返す(x と等しい値がある場合はその右側)
1
3
3
3

応用例

値が存在するか確認する

bisect_left が返すインデックスの値が x と等しければ存在する。

True
False

XX 以上の最小値 / XX より大きい最小値を求める

競プロでよく使うパターン。C++ の lower_bound / upper_bound に相当する。

  • bisect_left(a, x) → x 以上の最小値のインデックス(lower_bound)

  • bisect_right(a, x) → x より大きい最小値のインデックス(upper_bound)

5
7
7
None

範囲内の要素数を数える

bisect_right(a, hi) - bisect_left(a, lo) で lo <= x <= hi を満たす要素数が求まる。

3
7
1