为什么O(logm + logn)而不是TO(logm * logn)

时间:2014-04-19 09:13:42

标签: java algorithm complexity-theory

我在Stack Overflow上看了3次同样的问题: Complexity of an algorithm Time complexity for two pieces of code Tricky Big-O complexity

我想在其中一个问题中提出这个问题,但我不能,因为我在网站上是新的并且无法发表评论。

有人可以向我解释为什么复杂性为O(logm + logn)而不是O(logm * logn)? 我自己尝试解决它而O(logm * logn)对我来说更有意义...因为如果你运行n = 16和m = 1000然后你得到大约6 + 4 ......它更有意义它将运行6 * 4次......

你能为我澄清一下吗?谢谢:))

2 个答案:

答案 0 :(得分:1)

好吧,while循环在O(logm)中运行,其中日志的基数为3,在while循环之后,外部for循环运行常数次数< = 100,内部for循环运行在O(logn)中,日志的基数为2.

因为它在O(1)中运行,所以可以隐藏外部for循环(复杂性意味着忽略常量并研究增长,而不是算法执行的步骤数!);该算法具有O(logm + logn)复杂度,因为首先你在O(logm)中有一个while,然后在O(logn)中有for(你可以在内部使用for来加倍它们)。

答案 1 :(得分:1)

whilefor循环是两个独立的循环。 for不是内循环。代码就像这样

while (i>100){
    i = i/3;
} //end of while

for (int k=i; k>=0; k--){
    for (int j=1; j<n; j*=2)
        System.out.print(k + "\t" + j);
    System.out.println();
} //end of for

由于它们是分开的,因此结果应该相加,而不是相乘

相关问题