1. Extracting recurrences from recursive algorithms
{ Invariant: A[lo] < target < A[hi] } BinarySearch(A, lo, hi, target): if hi <= lo + 1: return hi mid = floor((lo + hi) / 2) if A[mid] = target: return mid if A[mid] < target: return BinarySearch(A, mid, hi, target) if A[mid] > target: return BinarySearch(A, lo, mid, target)
To analyze running time: use (hi - lo) as parameter n. Then
- T(1) = Theta(1)
T(n) <= T(n/2) + Theta(1) [more or less]
MergeSort(A): if length(A) > 1: MergeSort(A[1..n/2]) MergeSort(A[n/2+1..n]) Merge(A[1..n/2], A[n/2+1..n], A) {we assume this is Theta(n)}
Cost is now:
- T(1) = Theta(1)
- T(n) = 2 Theta(n/2) + Theta(n)
2. Solving recurrences
See SolvingRecurrences.