大哦(n log n)

hhe*_*klj 13 java algorithm big-o

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

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

pro*_*der 45

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
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

说明:外部for循环应该清晰; 它是执行n时间.现在到了内循环.在内循环中,你采取n并始终除以它2.所以,你问自己:我有多少次可以把n通过2

事实证明这是O (log n).事实上,基础log2,但在Big-O表示法中,我们删除了基数,因为它只会增加log我们不感兴趣的因素.

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

  • 这个例子旨在提供一个关于O(n log n)是什么的非常简单的例子.你不会在现实中看到这个算法.是的,这些算法是递归的,但迭代地解释O(n log n)更容易理解.关键是要看到你总是将n除以2.这是Mergesort等大多数算法的关键功能,您可以为每一半算法调用相同的算法.我认为这是合适的,因为他在他的问题中讨论了嵌套循环. (8认同)
  • 这将是O(n log n),但这是不现实的.几乎所有*O(n log n)算法都是递归的.也许你可以提供一个更典型的形式. (3认同)
  • @slashburn谢谢,这是最简单的解释..! (3认同)

rcs*_*rcs 5

一种非常流行的 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 。