Python3にはbisect
というモジュールがあり、この中にはbisect_left
、bisect_right
という関数が用意されています。bisect_left
はソート済みの配列を二分探索により探索し、挿入点のうちもっとも左側のものを戻り値とします。bisect_right
はその逆で、挿入点のうち、もっとも右側が戻り値となります。
import bisect
digits = [111, 222, 333, 333, 333, 444, 555]
bisect.bisect_left(digits, 333) #=> 2
bisect.bisect_right(digits, 333) #=> 5
Go言語でbisect_left
やbisect_right
と同じようなことをしたい場合、すなわち、__二分探索でもっとも左側の挿入点を探したい、もっとも右側の挿入点を探したい__場合、sort
パッケージのSearch
を利用し、それぞれ次のように実装します。
digits := []int{111, 222, 333, 333, 333, 444, 555}
sort.Search(len(digits), func(i int) bool { return digits[i] >= 333 }) //=> 2
sort.Search(len(digits), func(i int) bool { return digits[i] > 333 }) //=> 5
つまりbisect_left
の場合は等号付き不等号で比較、bisect_right
の場合は不等号で比較すればよいわけです。