【问题标题】:if condition in complexity O(n * log(n))如果条件复杂度 O(n * log(n))
【发布时间】:2018-06-03 19:47:06
【问题描述】:
s=0

for(i=1; i<n; i = i*2){ 
  if (i<20)
    for (j=0; j<n; j++)
    {
        s=s+i*j;
    }
    s=s+1
}

我正在尝试确定上述算法的大复杂度。外部循环从 1 开始并运行到 ni 中的计数器在每次迭代中翻倍,因此这是一个 log(n ) 行为。内部循环从 0nO(n) 行为独立运行。?

我不明白 if 语句如何影响复杂性。您可能不想为我提供答案,但请指导正确的方向,因为我根本不明白。

【问题讨论】:

  • 两种算法是相同的;您是否为其中之一粘贴了错误的代码?在任何情况下,if 语句都不会影响复杂性,因为它只删除了外部循环的恒定迭代次数。
  • @chepner 好的,谢谢,在这种情况下,答案将是 O(n * log(n))?
  • 这是 O(∞),因为外部循环中的 i 永远不会是 0。
  • @Sani Singh Huttunen 是的。但我想这是一个错字,因为操作员说i 从 1 开始......

标签: algorithm data-structures time-complexity big-o


【解决方案1】:

内部循环是O(N),但它只会运行5次, 即当i = 1, 2, 4, 8, 16

前5次迭代后,你的代码基本上变成了

for(i=32; i<n; i = i*2){ 
    s=s+1
}

这是O(log(N))

所以总复杂度是:

O(5 * N + log(N)) = O(N)

【讨论】:

  • 谢谢。你今天真的很有帮助和热情。你能告诉我如果我有 if 条件 if ((i n)) 这仍然是 O(log(n)) 吗?
  • @AlinaKhachatrian 它仍然是 O(N) - 与我在这里的答案相同的原因:i &gt; n 永远不会发生,因为您在 for 循环条件中有 i &lt; ni &lt; 10i &lt; 20 在 N 达到无穷大时没有区别
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多