バイナリサーチ
binary search: 二分探索
何度半分にすれば要素数が1になるか
$ N\times\left(\frac{1}{2}\right)^x = 1
$ \iff x = \log_2N
与える配列の要素がソートされていれば使える
code:jl
function binary_search(A::Vector, v)
head = 1
tail = length(A)
while head <= tail
middle = (head + tail) ÷ 2
if Amiddle == v
return println("見つかる")
elseif Amiddle < v
head = middle + 1
else
tail = middle - 1
end
end
return println("見つからない")
end
A = i for i in 1:1000000
binary_search(A, 123456)
binary_search(A, 1000001)
より安全に実装するならhead + (tail - head) ÷ 2とするべき
head + tail > typemax(Int)になる場合に意図しない動きになりうる
https://ja.wikipedia.org/wiki/二分探索#実装上の間違い
『Coders at Work プログラミングの技をめぐる探求』
中点を安全に得る
長大な配列に利用しない場合なら問題ない
長大な配列が通らなければよさそう?あんも.icon
code:jl
A = i for i in 1:typemax(Int) # ArgumentError: invalid GenericMemory size: too large for system address width
A = i for i in 1:typemax(Int) ÷ 1e10 # 強制終了したりしなかったり
https://docs.julialang.org/en/v1/base/sort/#Base.Sort.searchsorted
https://github.com/JuliaLang/julia/blob/master/base/sort.jl#L223
https://github.com/JuliaLang/julia/blob/master/base/array.jl#L2196