algorithm - 复杂度是 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + log(2)) = O(log(n)) 吗?

标签 algorithm complexity-theory

作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + log(2)).

我认为它是 O(n),因为它大致是 log(n)*O(log(n)) = O(n)。但我不确定。我知道这里不欢迎作业问题,但我真的不知道还有什么方法可以找出它的复杂性。谷歌搜索对我没有帮助。

指定:n in N and n = pow(2, c), c in N

最佳答案

不,这不是 O(log n)。它是 O((log n)2).

O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + log(2))
= O(log(n * n/2 * n/4 * n/8 * ... * 2))                    using log multiplication rule
= O(log(n * n * n * ... * n / 2 / 4 / 8 / ... / n))
= O(log(n<sup>log n</sup> / 2 / 4 / 8 / ... / n))
= O(log(n<sup>log n</sup> / (1 * 2 * 4 * 8 * ... * n/4 * n/2 * n))
= O(log(n<sup>log n</sup> / ((1 * n) * (2 * n/2) * (4 * n/4) * ...)    group first and last terms
= O(log(n<sup>log n</sup> / (n * n * n * ...))                         since we grouped terms,
= O(log(n<sup>log n</sup> / n<sup>(log n)/2</sup>)                                      we halved the number of terms
= O(log(n<sup>log n</sup>) - log(n<sup>(log n)/2</sup>))                             log division rule
= O(log n.log n) - ((log n)/2).log n)                      log power rule * 2
= O(log n.log n) - (log n.log n)/2)
= O(log n.log n)/2)
= O((log n)<sup>2</sup>/2)
= O((log n)<sup>2</sup>)                                              big-O doesn't care about constants

关于algorithm - 复杂度是 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + log(2)) = O(log(n)) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231116/

相关文章:

algorithm - 计算递推关系 T(n)=T(n/[(log n)^2]) + θ(1)

java - java中算法的时间复杂度

c - 这个双重嵌套循环的时间复杂度是多少?

c++ - 计算点云部分体积的算法

sql - 重新排序 SQL Server 数据库中的项目

java - Java代码中的插入排序算法缺陷

algorithm - 程序能否输出自身的副本

python - 如何删除基于日期的重复元素

java - 这里的内存复杂度是O(1)还是O(N)?

算法时间复杂度分析(三个嵌套的for循环)