Java Chapter 16 - Big O Notation
In comparing algorithms (e.g.
sorts), the Big O Notation can be used to compare their growth rate as the size
of the data set (n) increases. Big O is just one tool to compare
algorithms. Just because two algorithms have the same Big O doesn't mean
that they are exactly equivalent - there are other variables to consider.
Big O is generally listed as time complexity or space complexity.
Big O time complexity typically shows how many iterations (loops) are necessary and is expressed
in terms of the data set size n. It states the worst case scenario.
For example, a for loop would be listed as
O(n)
whereas a nested for loop would be
O(n2).
Big O space complexity shows how much memory the algorithm uses as the data set
size increases. For example, if a sort algorithm creates new dynamic arrays,
then the space complexity will be larger than O(n).
16.1
Big O Time Complexity Examples
| Big O | Description | Example(s) |
| O(1) | This describes an algorithm that will execute in the same amount of time regardless of the size of the data input. |
- a series of if statements or a fixed size loop - hash table |
| O(n) | This describes an algorithm the grows linearly in proportion to the size of the data set (n). |
- a for loop that executes n times - Searching an array or stack |
| O(n2) | This describes an algorithm that grows proportionally to the square of the size of the data set. A nested for loop such as the bubble sort has this growth rate. |
- nested for loop - bubble sort - selection sort |
| O(2n) | Each time a function is called, it invokes two additional function calls. | - recursive Fibonacci function |
| O(log(n)) | This describes an algorithm that grows logarithmically to the size of the data set. Note that in programming this often means a base logarithm: log2(n) | - binary search tree |
| O(n log(n)) | This describes an algorithm where the data set is split in halves recursively and each part is executed n times. | - merge sort |
For example, the Bubble Sort can be written as a nested for loop where each loop
executes n times (below).
Therefore, the growth rate is the square of the growth rate of the size of the
data set (n). This is written
O(n2).
// bubble sort
for (int x=0; x<n; x++)
{
for (int y=0; y<n; y++)
{
// compare data[y] & data[y+1]
and swap if needed
}
}
The graph below shows the growth rate for some popular algorithms. The
y-axis is usually expressed as time, but could also be expressed as number of
iterations.

16.2
Algorithms Compared
| Algorithm |
Time Complexity |
Space Complexity |
| Array Search | O(n) | O(n) |
| Stack Search | O(n) | O(n) |
| Linked List Search | O(n) | O(n) |
| Binary Tree Search | O(log(n)) | O(n) |
| Bubble Sort | O(n2) | O(n) |
| Selection Sort | O(n2) | O(n) |
| Merge Sort | O(n log(n)) | O(log(n)) |
| Radix Sort | O(nk) | O(n+k) |
n = dataset size, k = length of keys