algorithm - 这个算法的运行时间复杂度是多少

标签 algorithm math complexity-theory big-o

这个算法的时间复杂度是多少:

sum = 0
i = 1

while (i < n) {

    for j = 1 to i {
        sum = sum + 1
    }

    i = i*2;
}

return sum

我知道while 循环是O(logn),但是for 循环的复杂度是多少?是 O(n) 还是 O(logn)

最佳答案

分析这一点的一种方法是计算内循环的迭代次数。在第一次迭代中,循环运行一次。在第二次迭代中,它运行两次。它在第三次迭代中运行四次,在第四次迭代中运行八次,更一般地在第 k 次迭代中运行 2k 次。这意味着内循环的迭代次数由下式给出

1 + 2 + 4 + 8 + ... + 2r = 2r + 1 - 1

其中 r 是内循环运行的次数。正如您所指出的,r 大约是 log n,这意味着这个总和可以(大约)

2log n + 1 - 1 = 2(2log n) - 1 = 2n - 1

因此,内部循环在所有迭代中完成的总工作量为 O(n)。由于该程序在运行外循环时总共执行了 O(log n) 的工作,因此该算法的总运行时间为 O(n + log n) = O(n)。请注意,我们没有将这些项相乘,因为 O(log n) 项是纯粹在维护外部循环中完成的工作总量,而 O(n) 项是纯粹由内循环。

希望这对您有所帮助!

关于algorithm - 这个算法的运行时间复杂度是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941720/

相关文章:

algorithm - 具有空元素的中序、先序和后序遍历的唯一性

c - 我为类制作的 e^x 函数得到了错误的输出,并且得到了错误的项数

algorithm - 为什么Arc-Consistency Algorithm的复杂度是O(cd^3)?

algorithm - 多个函数的大 O 表示法

java - 你能帮我计算一下这个算法的时间复杂度吗?

javascript - 按可变列数对数组进行排序

python - 使用邻接表表示最小生成树

c++ - 通过元素原始位置的奇偶校验来稳定分区std::vector

c# - 如何测试向量3是否位于围绕特定点旋转的立方体内部

java - 如何手动舍入?