Skip to main content

Cut the Problem in Half

O(log n) means logarithmic time: every step cuts the remaining work in half. Because halving shrinks numbers so fast, doubling the input adds only one extra step.

16 elements need 4 halvings, 32 elements need 5, a million elements about 20, a billion about 30. That is why logarithmic algorithms feel instant even on huge data.

The classic example is binary search — but it only works on sorted data. Halving needs an order to know which half to throw away.


A Halving Loop

The simplest way to see O(log n) is a loop that divides n by 2 until it reaches 1. The number of rounds is the logarithm of n: for n = 16 the loop runs 4 times, because 2 · 2 · 2 · 2 = 16.

Halving until one remains

16 becomes 8, 4, 2, 1 — four steps. Doubling n to 32 would add just one more step.

Prompt
Write a PHP script that starts with n = 16 and divides n by 2 in a loop until it reaches 1, printing n after every division and counting the steps. At the end print how many steps it took.
Output: PHP script
Halving until one remains

Binary Search

Binary search finds a value in a sorted array by always checking the middle element. If the middle is too small, the whole left half is thrown away; if too big, the right half. Each check halves the search range.

Two markers, $lo and $hi, hold the current range. The loop ends when the value is found or the range is empty.

PHP has no ready-made binary search in its standard library. The built-in array_search() finds a value by scanning from the start — that is linear, O(n). On sorted data a hand-written binary search is the faster tool, and it can also tell you where a missing value would fit.

Binary search step by step

In a sorted array of 16 numbers, the search for 13 needs only 4 checks: the range shrinks 16 → 8 → 4 → 2 and lands on index 6. A linear search would have needed 7 steps here — and up to 16.

Prompt
Write a PHP script that binary-searches the sorted array 1, 3, 5, 7, ... 31 (the odd numbers, 16 elements) for the value 13, using lo and hi markers and counting the checks. When found, print the value, its index and the number of checks.
Output: PHP script
Binary search step by step

Binary search vs array_search()

binarySearch() finds 9 at index 4. The missing value 10 gives found: false and index 5 — the place where 10 would fit to keep the array sorted. array_search() answers too, but it scans the array linearly, and for the missing 10 it returns only false — no position.

Prompt
Write a PHP function binarySearch that returns the index and a found flag for a value in the sorted array 1, 3, 5, 7, 9, 11, 13, 15, where a missing value's index is the position it would be inserted at. Search for 9 and for the missing 10 and print both results, then run array_search on the same two values to compare.
Output: PHP script
Binary search vs array_search()

O(n log n): Sorting

O(n log n) sits between linear and quadratic and is the complexity of good sorting algorithms: the data is halved again and again (log n levels), and each level does a linear amount of work (n).

In PHP you rarely write a sort yourself — sort() is O(n log n). It takes the array by reference and sorts it in place: the array itself is changed, nothing needs to be assigned back. Sorting once, then binary-searching many times, is a common and fast pattern.

Sort an array

sort() orders the 8 numbers in place, in about 8 · log 8 = 24 steps — far fewer than the 64 a quadratic sort would use, and the gap widens fast as the array grows.

Prompt
Write a PHP script that sorts the array 31, 5, 17, 1, 23, 9, 27, 13 with sort and prints the sorted array.
Output: PHP script
Sort an array