我在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次......
你能为我澄清一下吗?谢谢:))
答案 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)
while
和for
循环是两个独立的循环。 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
由于它们是分开的,因此结果应该相加,而不是相乘