【问题标题】:Time complexity difference - O(log log n) vs O(log n)时间复杂度差异 - O(log log n) vs O(log n)
【发布时间】:2021-02-17 13:58:02
【问题描述】:

我正在审查如何计算函数的时间复杂度,并且正在努力推理以下内容:

据我了解,O(log log n) 小于 O(logn),因为:

O (log n) | O [ log (log n) ]

= O (log 100) | O [ log (log 100) ]

= O (2) | O [ log (2) ]

= O (2) | O [ 0.3010 ]

但是,我相信下面的 sn-p 可以计算为 O( log log n ):

p = 0
for( i=1; i<n; i=i*2 ) { 
    p++ // log n 
} 

for( j=1; j<p; j=j*2 ) { 
    some_statement // log P
}
// P=log n, ∴ O( log log n )

但是,如果我们简单地隔离第一个循环,我们会得到 O(log n),因此运行时的增长比两个 for 循环都大。

O(log log n) 的原始评估不正确吗?否则,您能解释一下引入额外的 for 循环是如何降低运行时复杂度的吗?

谢谢

【问题讨论】:

  • 您将时间复杂度与值的计算混淆了。循环不是嵌套的,所以你原来的复杂性是不对的。
  • 您的论点是第二个循环需要 O(log log n) 时间(正确),但随后您错误地将其扩展为说整个代码需要 O(log log n) 时间。跨度>
  • @PaulHankin 啊,我明白了,那么我们应该“求和”两个 for 循环的运行时间?
  • 我发现在使用复杂性时说出我正在衡量的内容很有帮助。例如,“代码执行 O(log log n) 循环迭代”。目前您的语言非常模糊(抱歉,如果英语不是您的第一语言),例如“sn-p 可以计算为 O(log log n)”,其中没有任何具体含义,尽管可以有各种解释被猜到了。
  • 你必须弄清楚你在测量什么,然后它就更清楚了。如果是语句,那么您必须在它们所在的任何循环中计算语句(因此“sum”是正确的)。

标签: algorithm big-o logarithm


【解决方案1】:

你不能仅仅假设整个算法的时间复杂度为 log log n。由于您的第一个循环的复杂度为 log n,您正确地说第二个循环的 计算时间 为 log(log n),整个算法的时间复杂度仍然为 log(n ) 尽管。这是因为本质上只考虑了最高的时间复杂度。

您还应该注意到,Big O 并不关心常数乘数。如果你有一个计算时间为 2500 log(n) 的算法,它仍然可以被认为是大 O 表示法的 log(n)。因此,总结多个for循环不会改变计算时间复杂度的方式

【讨论】:

    【解决方案2】:

    N=1.15792...10^77.第一个循环将执行1024 次。第二个将被执行10 次。你可以得出结论。


    请注意,对于 N 的中等值,log Nlog log N 之间的区别真的不重要!

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多