大哦(n log n)

时间:2013-09-26 06:42:13

标签: java algorithm big-o

我目前正在研究Big Oh的基本算法。我想知道是否有人可以告诉我使用Big Oh的Java(n log n)代码是什么样的或将我引导到任何存在的SO页面。

由于我只是一个初学者,我只能在编写之前想象代码。所以,理论上(至少),它应该包含一个for循环,其中我们有n次。然后对于log n,我们可以使用while循环。那么循环执行n次,while循环执行log base 2次。至少这就是我想象它的方式,但看到代码会清除。

4 个答案:

答案 0 :(得分:42)

int n = 100
for(int i = 0; i < n; i++) //this loop is executed n times, so O(n)
{
    for(int j = n; j > 0; j/=2) //this loop is executed O(log n) times
    {

    }
}

说明: 外部for循环应该是清晰的;它执行n次。现在到了内循环。在内部循环中,您需要n并始终将其除以2。所以,你问自己:我可以将n除以2多少次?

事实证明这是O (log n)。实际上,log的基数为2,但在Big-O表示法中,我们删除了基数,因为它只会添加我们感兴趣的log因子。

因此,您正在执行循环n次,并且在该循环内,您正在执行另一个循环log(n)次。所以,你有O(n) * O(log n) = O(n log n)

答案 1 :(得分:4)

非常流行的O(n log n)算法是合并排序。 http://en.wikipedia.org/wiki/Merge_sort例如算法和伪代码。算法的log n部分是通过将问题分解为较小的子问题来实现的,其中递归树的高度为log n。

许多排序算法的运行时间为O(n log n)。有关更多示例,请参阅http://en.wikipedia.org/wiki/Sorting_algorithm

答案 2 :(得分:2)

O(.)时间复杂度涉及log n的算法通常涉及某种形式的分而治之。

例如,在MergeSort中,列表减半,每个部分都单独合并排序,然后两个部分合并在一起。每个列表减半

每当你的工作量减半或减少一些固定因素时,你通常会得到log n的{​​{1}}成分。

在代码方面,请看一下MergeSort的算法。典型实现的重要特征是它是递归的(注意O(.)在维基百科上给出的代码中调用自己两次。)

所有良好的标准排序算法都有TopDownSplitMerge时间复杂度,在最坏的情况下无法做得更好,请参阅Comparison Sort

要查看Java代码中的内容,只需searchHere's one example

答案 3 :(得分:1)

http://en.wikipedia.org/wiki/Heapsort

简单的例子就像你描述的那样 - 执行n次一些占用log(n)时间的操作。 平衡二叉树具有log(n)高度,因此一些树算法将具有这种复杂性。