I am currently studying basic algorithms for Big Oh. I was wondering if anyone can show me what the code for (n log n) in Java using Big Oh would be like or direct me to any SO page where one exists.
Since I am just a beginner, I can only imagine the code before I write it. So, theoretically (at least), it should contain one for loop where we have something of n times. Then for the log n, we can use the while loop. So then the loop is executed n times and the while loop is executed log base 2 times. At least that is how I am imagining it in my head but seeing the code would clear things up.
A very popular O(n log n) algorithm is merge sort. http://en.wikipedia.org/wiki/Merge_sort for example of the algorithm and pseudocode. The log n part of the algorithm is achieved through breaking down the problem into smaller subproblems, in which the height of the recursion tree is log n.
A lot of sorting algortihms has the running time of O(n log n). Refer to http://en.wikipedia.org/wiki/Sorting_algorithm for more examples.
Algorithms with a
O(.)
time complexity involvinglog n
's typically involve some form of divide and conquer.For example, in MergeSort the list is halved, each part is individually merge-sorted and then the two halves are merged together. Each list is halved.
Whenever you have work being halved or reduced in size by some fixed factor, you'll usually end up with a
log n
component of theO(.)
.In terms of code, take a look at the algorithm for MergeSort. The important feature, of typical implementations, is that it is recursive (note that
TopDownSplitMerge
calls itself twice in the code given on Wikipedia).All good standard sorting algorithms have
O(n log n)
time complexity and it's not possible to do better in the worst case, see Comparison Sort.To see what this looks like in Java code, just search! Here's one example.
http://en.wikipedia.org/wiki/Heapsort
Simple example is just like you described - execute n times some operation that takes log(n) time. Balanced binary trees have log(n) height, so some tree algorithms will have such complexity.
Explanation: The outer for loop should be clear; it is executed
n
times. Now to the inner loop. In the inner loop, you taken
and always divide it by2
. So, you ask yourself: How many times can I dividen
by2
?It turns out that this is
O (log n)
. In fact, the base oflog
is2
, but in Big-O notation, we remove the base since it only adds factors to ourlog
that we are not interested in.So, you are executing a loop
n
times, and within that loop, you are executing another looplog(n)
times. So, you haveO(n) * O(log n) = O(n log n)
.