Memory Hook
📖 O(log n) = phone book search. Finding "Smith" in a 1000-page phone book: open to page 500. Too early? Jump to 750. Too late? Jump to 625. You're halving the search space every time. A million-item input only needs ~20 steps (log₂(1,000,000) ≈ 20).
Code Pattern — look for HALVING
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target: return mid
elif arr[mid] < target: lo = mid + 1 # cut LEFT half
else: hi = mid - 1 # cut RIGHT half
# each step: input SIZE HALVES → log n steps total
Time vs Space
⏱ Time O(log n)
Doubling the input only adds ONE more step. n=1M → 20 steps. n=2M → 21 steps.
💾 Space O(1) or O(log n)
Iterative binary search: O(1). Recursive: O(log n) because the call stack grows log n deep.
Real examples
Binary search
BST lookup
AVL tree operations
Heap insert/delete
Git bisect