Pythonでは、C++のstd::lower_bound
やstd::upper_bound
に相当する機能がbisect
モジュールに存在します。これらの関数は、ソートされたリストに対して二分探索を行い、特定の条件を満たす要素のインデックスを返します。
lower_boundとupper_boundの基本
lower_bound
は、指定した値以上の最初の要素のインデックスを返します。一方、upper_bound
は、指定した値を超える最初の要素のインデックスを返します。
例えば、以下のようなリストがあるとします。
a = [1, 1, 2, 2, 2, 3, 3]
このリストで、2
をキーとした場合、lower_bound
とupper_bound
は以下のようなインデックスを返します。
lower_bound(a, 2)
は2
が始まる位置、つまりインデックス2
を返します。upper_bound(a, 2)
は2
が終わる位置の次、つまりインデックス5
を返します。
Pythonでの実装
Pythonでは、bisect
モジュールのbisect_left
関数とbisect_right
関数を使用して、lower_bound
とupper_bound
を実装できます。
import bisect
a = [1, 1, 2, 2, 2, 3, 3]
x = 2
# lower_bound
index = bisect.bisect_left(a, x)
print(index) # Output: 2
# upper_bound
index = bisect.bisect_right(a, x)
print(index) # Output: 5
このように、Pythonのbisect
モジュールを使用することで、効率的にlower_bound
とupper_bound
を計算することができます。これらの関数は、データ構造やアルゴリズムを扱う際に非常に便利です。