Mastering Logarithmic Time Complexity

Logarithmic time complexity, denoted as O(log n), represents algorithms that reduce the problem size drastically at each step. A classic example is binary search, where the input size is halved at every iteration.

Binary Search Example

function binarySearch(arr, target) {
  let left = 0, right = arr.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;
    if (arr[mid] < target) left = mid + 1;
    else right = mid - 1;
  }
  return -1;
}

At each step, the search space is divided by 2. This results in log₂(n) steps in the worst case, making it significantly faster than linear search for large datasets.

When to Expect Logarithmic Complexity

Algorithms that:

  • Divide the problem space repeatedly
  • Work with sorted data or tree-like structures (e.g., binary search trees, heaps)
  • Use recursive halving strategies

These typically fall under O(log n) time.

Why It Matters

Logarithmic algorithms scale extremely well. Even for large input sizes, the number of steps grows slowly. For example:

  • n = 1,000 → log₂(n) ≈ 10
  • n = 1,000,000 → log₂(n) ≈ 20

Understanding and identifying opportunities to use O(log n) algorithms is a major step toward writing highly efficient code.