我目前正在研究 Big Oh 的基本算法。我想知道是否有人可以向我展示使用 Big Oh 的 Java 中 (n log n) 的代码是什么样的,或者将我引导到任何存在的 SO 页面。
由于我只是一个初学者,我只能在写之前想象代码。因此,理论上(至少),它应该包含一个 for 循环,其中我们有 n 次。那么对于log n,我们可以使用while循环。因此,循环执行 n 次,while 循环执行 log base 2 次。至少这就是我在脑海中想象的方式,但看到代码就会把事情弄清楚。
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)
.
一个非常流行的 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。
http://en.wikipedia.org/wiki/Heapsort
简单的例子就像你描述的那样 - 执行 n 次一些需要 log(n) 时间的操作。平衡二叉树具有 log(n) 高度,因此某些树算法将具有如此复杂性。