See also: complexity analysis

LinearSearch(L, v, o): potentially-high cost

LowerBoundRec(L, v, begin, end)
# Input: L: ordered array, v: value, 0 <= begin <= end <= |L|
if begin = end then
  return begin
else
  mid := (begin + end) div 2
  if L[mid] < v then
    return LowerBoundRec(L, v, mid+1, end)
  else if L[mid] >= v then
    return LowerBoundRec(L, v, begin, mid)
# Result: return first offset r, begin <= r <= end with L[r] = v, or no such offset exists, r = |L|

repetition induction

Induction hypothesis:

Recursive case: mid := (begin + end) div 2:

termination bound function:

Complexity:

Complexity: . Assume , work = 1

Can usually assume

Theorem

LowerBoundRec is correct and runtime and memory complexity of

LowerBound(L, v, begin, end)
# Input: L: ordered array, v: value, 0 <= begin <= end <= |L|
while begin < end do
  mid := (begin + end) div 2
  if L[mid] < v then
    begin := mid + 1
  else
    end := mid
return begin