Java 大Oh for(n日志n)

Java 大Oh for(n日志n),java,algorithm,big-o,Java,Algorithm,Big O,我目前正在学习的基本算法大哦。我想知道是否有人可以告诉我使用Big Oh的Java中(n log n)的代码是什么样的,或者将我引向任何存在的SO页面 由于我只是一个初学者,我只能在编写代码之前想象代码。所以,理论上(至少),它应该包含一个for循环,其中我们有n次。然后对于logn,我们可以使用while循环。因此,循环执行n次,while循环执行2次。至少这是我在脑海中的想象,但看到代码会让事情变得清晰 一种非常流行的O(n logn)算法是合并排序。例如算法和伪代码。算法的logn部分是通

我目前正在学习的基本算法大哦。我想知道是否有人可以告诉我使用Big Oh的Java中(n log n)的代码是什么样的,或者将我引向任何存在的SO页面

由于我只是一个初学者,我只能在编写代码之前想象代码。所以,理论上(至少),它应该包含一个for循环,其中我们有n次。然后对于logn,我们可以使用while循环。因此,循环执行n次,while循环执行2次。至少这是我在脑海中的想象,但看到代码会让事情变得清晰

一种非常流行的O(n logn)算法是合并排序。例如算法和伪代码。算法的logn部分是通过将问题分解成更小的子问题来实现的,其中递归树的高度是logn

许多排序算法的运行时间为O(n logn)。有关更多示例,请参阅。

这个简单的例子和您描述的一样——执行n次需要日志(n)时间的操作。 平衡二叉树具有对数(n)高度,因此某些树算法将具有这样的复杂性。

int n=100
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(int i=0;i0;j/=2)//此循环执行O(logn)次 { } }
说明: 外部for回路应清晰;它被执行
n次。现在进入内部循环。在内部循环中,取
n
,并始终将其除以
2
。所以,你问自己:我能用
2
除以
n
多少次

原来这是
O(logn)
。事实上,
log
的基数是
2
,但在Big-O表示法中,我们删除了基数,因为它只会将我们不感兴趣的因素添加到
log

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

具有
O(.)
时间复杂度的算法,涉及
logn
,通常涉及某种形式的分治

例如,在列表中,每个零件被单独合并排序,然后两半合并在一起。每个名单都减半

每当你的工作量被减半或缩小到某个固定系数时,你通常会得到
O(.)
logn
组件

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

所有好的标准排序算法都有
O(n logn)
时间复杂度,在最坏的情况下不可能做得更好,请参阅


要查看Java代码中的情况,只需

我不确定我是否理解正确。你是在问一个时间复杂度为O(n logn)的算法的例子吗?试着学习任何好的排序算法,比如合并排序。下面的链接可能会帮助您是的。我只是想看看Java程序中的代码是什么样子。@hherkljkljkljkljklj在欣赏大多数O(n logn)算法之前,您可能需要学习递归。它们通常不包含两个嵌套的显式循环。听起来您可能有点困惑。O表示法不是一种算法,它是一种描述算法的度量。所以,您不需要实现O(nlogn)——您需要实现一个算法,它可以保证O(nlog)的性能。用一个房屋类比,你不需要建造20英尺,你需要建造一座房子,然后测量它有多少英尺高,这可能是O(n logn),但这是不现实的。几乎所有的O(nlogn)算法都是递归的。也许您可以提供一个更典型的表单,这个示例旨在提供一个关于O(n logn)是什么的非常简单的示例。你不会在现实中看到这种算法。是的,这些算法是递归的,但是迭代地解释O(nlogn)更容易理解。关键是要确保你总是把n除以2。这是大多数算法(如Mergesort)的一个关键特性,在Mergesort中,每一半调用相同的算法。我认为这是合适的,因为他在问题中谈到了嵌套循环。@slashburn谢谢,这是最简单的解释@KevinA.Naudé任何可以递归编写的东西都可以迭代编写,所以说它不现实是没有意义的。@Ari如果我们做j——而不是j/=2,那么它将是O(n^2),但因为我们每次迭代都除以2,所以它是O(n*log(n))