Week 4, Tuesday (Video)
January 27, 2026
We continued the discussion from class…
The recurrence:
\[T(n) = 2T(n/2) + O(n)\]
\[T(n) = 2T(n/2) + n\]
This is a recurrence relation: T(n) defined in terms of T(smaller).
merge_sort([7,1,6,4,5,3,2,8])
/ \
merge_sort([7,1,6,4]) merge_sort([5,3,2,8])
/ \ / \
ms([7,1]) ms([6,4]) ms([5,3]) ms([2,8])
/ \ / \ / \ / \
[7] [1] [6] [4] [5] [3] [2] [8]
How deep does this go?
At each level, problem size halves: \(n \to n/2 \to n/4 \to \ldots \to 1\)
Depth = How many times can we halve \(n\)?
\[n \to n/2 \to n/4 \to \ldots \to 1\]
Answer: \(\log_2 n\) levels
Level 0: [n] n work (merge)
/ \
Level 1: [n/2] [n/2] n work (two merges of n/2)
/ \ / \
Level 2: [n/4]×4 n work (four merges of n/4)
...
Level log n: [1]×n n work (base cases)
Total work: \(n \times \log n = O(n \log n)\)
Different recursive structures - → different recurrences - → different running times!
Example: Processing a list one element at a time
\(T(n) =\)
Example: Binary search
\(T(n) =\)
Example: triangle_double — calls itself twice!
\(T(n) =\)
Example: Merge sort!
\(T(n) =\)
Example: Selection sort (find min, then sort rest)
\(T(n) =\)
| Algorithm | Recurrence | Solution |
|---|---|---|
| Binary search | \(T(n) = T(n/2) + O(1)\) | |
| Merge sort | \(T(n) = 2T(n/2) + O(n)\) | |
| Linear search | \(T(n) = T(n-1) + O(1)\) | |
triangle_double |
\(T(n) = 2T(n/2) + O(1)\) | |
| Selection sort | \(T(n) = T(n-1) + O(n)\) |
| Recurrence | Solution | Why? |
|---|---|---|
| \(T(n) = T(n-1) + 1\) | \(O(n)\) | \(n\) levels × \(O(1)\) work |
| \(T(n) = T(n/2) + 1\) | \(O(\log n)\) | \(\log n\) levels × \(O(1)\) work |
| \(T(n) = 2T(n/2) + 1\) | \(O(n)\) | Doubling nodes overwhelms depth |
| \(T(n) = 2T(n/2) + n\) | \(O(n \log n)\) | \(\log n\) levels × \(O(n)\) work |
| \(T(n) = T(n-1) + n\) | \(O(n^2)\) | \(n\) levels × \(O(n)\) avg work |
Math vs. Time: Same functionality, different running times!
Merge sort: Divide, conquer, merge
MS recurrence: \(T(n) = 2T(n/2) + O(n)\)
Recursion sketches: Visualize depth × work per level
Recurrence forms: Different structures → different runtimes