🔍

線形探索と二分探索の違い

2023/08/17に公開

線形探索

先頭から探すので遅い場合もあるが、配列をメンテする必要がないので扱いやすい。

def linear_search(a, v)
  a.size.times do |i|
    if a[i] == v
      return true
    end
  end
  false
end
linear_search([*0...100], 99)   # => true
linear_search([*0...100], 100)  # => false

二分探索

ソート済みであることが条件だが半分ずつ詰めていくため速い。

def binary_search(a, v, l = 0, r = a.size.pred)
  if r < l
    return false
  end
  m = (l + r) / 2
  if a[m] == v
    return true
  end
  if v < a[m]
    r = m.pred
  else
    l = m.succ
  end
  send(__method__, a, v, l, r)
end
binary_search([*0...100], 99)   # => true
binary_search([*0...100], 100)  # => false

計算時間

  • 線形探索: O(n)
  • 二分探索: O(log n)

Discussion