Binary Search analysis
Pseudocode:
function binarySearch(a, value, left, right) if right < left return not found mid := floor((right-left)/2)+left if a[mid] = value return mid if value < a[mid] return binarySearch(a, value, left, mid-1) else return binarySearch(a, value, mid+1, right)
Note that mid is defined as
floor((right-left)/2+left
cause if the array is indexed, say, form 4 to 10, the mid is actually
(high - low)/2 + offset
A binary search halves the number of items to check with each iteration, so locating an item (or determining its absence) takes logarithmic time.
A sketch of the proof for N being even is the following: we define \( C(N) \) as the number of compares needed to locate the key in an array of N elements. We start with
\[C(0) = 0 \\
C(1) = 1 \\
C(N) \leq C(N/2) + 1 \\
\]
the number of compares for N is at most N/2 + 1: 1 to check for equality and decide for the left half or the right half. Applying the same logic, we obtain:
\[\begin{align}
C(N/2) + 1 & \leq C(N/4) + 1 + 1 \\
& \leq C(N/8) + 1 + 1 + 1 \\
& \leq C(N/16) + 1 + 1 + 1 + 1 \\
& \leq C(N/N) + 1 + 1 + 1 + 1 + … + 1 \\
& = 1 + \log N \\
\end{align}
\]
At that point we stop since C(1) = 1, giving us the number of times we had to halve the space search to get to N.
Implementation in Python: recursive
def bs(n, l): if len(l) < 1: return 'not found' mid = len(l)/2 if l[mid] == n: return l[mid] elif n < l[mid]: return bs(n, l[:mid]) else: return bs(n, l[mid+1:])
iterative:
def ibs(n, l): imin = min(l) imax = max(l) while imax > imin: imid = (imax - imin)/2 + imin if l[imid] == n: return l[imid] elif n < l[imid]: imax = imid - 1 else: imin = imid + 1 return 'not found'