【问题标题】:Why O(logm + logn) and not O(logm * logn) [closed]为什么 O(logm + logn) 而不是 O(logm * logn) [关闭]
【发布时间】:2014-04-19 18:21:36
【问题描述】:

我在 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 次...

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

【问题讨论】:

  • 第一个链接的答案解释了它......
  • Big-O 问题突然涌现。你在课堂上没有教过任何东西吗?
  • @devnull 我认为我们真的需要一个常见问题解答类型的问题,我们可以将 VTC 几乎任何东西作为副本。
  • while循环的运行时间为O(log m),for循环的运行时间为O(log n),如果没有嵌套,就增加了复杂度——哪一部分你不明白?跨度>
  • 正如我所说,我想在 cmets 中问这个问题,但由于我是新手,所以我不能因为声誉低下......对不起。至于你的问题 devnull,你会惊讶于一些机构的教学方式......

标签: java algorithm complexity-theory


【解决方案1】:

好吧,while 循环运行在 O(logm) 中,其中日志的底数为 3,在 while 循环之后,外部 for 循环运行恒定次数

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

【讨论】:

  • 对!谢谢,我的坏。 while 循环是运行 log_3(m) 次的循环,第一个 for 循环根据 while 循环的结果运行...抱歉,我没有注意到 :)
【解决方案2】:

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

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

【讨论】:

  • 也谢谢你:)你用更简单的方式解释了
  • @unknown2u 不客气
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多