对于如何计算最佳案例运行时间 - 欧米茄f(n) - 我对此算法感到困惑。特别是,我不明白如何有一个“最佳案例” - 这似乎是一个非常简单的算法。有人可以给我一些提示/一般方法来解决这些类型的问题吗?
for i = 0 to n do
for j = n to 0 do
for k = 1 to j-i do
print (k)
答案 0 :(得分:3)
看看这个问题和答案Still sort of confused about Big O notation它可以帮助你解决最坏情况,最佳情况,大O,大欧米茄等之间的一些混淆。
至于你的具体问题,你被要求找到算法时间复杂度的一些(渐近)下限(你还应该澄清你是指大欧米茄还是小欧米茄)。
否则你是对的,这个问题很简单。您只需考虑为给定的print (k)
执行n
的次数。
你可以看到第一个循环是n次。第二个也是n次。
对于第三个,你看到如果i = 1,那么j = n-1,因此k是1到n-1-1 = n-2,这让我想到你的例子是否正确以及是否存在应改为i-j
。
在任何情况下,第三个循环将至少执行n / 2次。它是n/2
,因为当j-i
增加时减去j
和i
减少,所以n/2
0
结果为print (k)
然后它将是负数,此时最内层的循环将不再执行。
因此n*n*n/2
将执行Omega(n^3)
- print(k)
次,您可以从定义中轻松验证。
请注意,正如@Yves在答案中指出的那样,这是假设log(n)
在恒定时间内完成,这可能就是你练习中的含义。
在现实世界中,这不是真的,因为打印数字也需要时间,如果print(k)
在基数2或基数10中打印,则时间会增加n
(它将是{{ 1}}对于基地1)。
否则,在这种情况下,最好的情况与最坏情况相同。只有一个大小为n
的输入,因此您无法找到大小为n
的“最佳实例”和大小为n
的“最差实例”。只有大小n
的实例。
答案 1 :(得分:2)
除了 n
之外,我在该功能中看不到不同执行之间的任何变化除此之外,据我所知,只有一个案例,这是同时最好的情况和最坏的情况
O(n 3 )以防您想知道。
答案 2 :(得分:0)
如果这是一种虐待狂,那么复杂性可能是Theta(n^3.Log(n))
,因为三重循环,但也因为要打印的数字位数随n
而增加。
答案 3 :(得分:-1)
作为n
算法行为的唯一因素,最好的情况是n
为0
。一次初始化,一次测试,然后完成......
修改强>: 最佳案例描述了最优条件下的算法行为。您提供了一个依赖于n的代码片段。什么是nbest案件? n为零。
另一个例子: 在数组上执行线性搜索的最佳情况是什么?要么键匹配第一个元素,要么数组为空。