【发布时间】: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”是正确的)。