【问题标题】:time complexity and geometric series, nested loops时间复杂度和几何级数,嵌套循环
【发布时间】:2019-03-21 11:10:52
【问题描述】:

我有以下代码,我想了解它的时间复杂度:

for (int i = 1 ; i <= n ; i = i*2)
    for (int j = 1 ; j <= n ; j = j*2)
        for (int k = 1 ; k <= j ; k++)

我所做的是:
第一个循环运行 log n 次,第二个循环也运行 log n 次,第三个循环是几何级数

所以总的来说我的运行时间是:n*(log(n))^2

这是正确的吗?
谢谢!

【问题讨论】:

  • 差不多。正确答案中只有一个因素log(n) - 你知道为什么吗?
  • 是不是因为我在计算第三个循环的几何级数时使用了第二个循环? n=log n, q=2,a=1..
  • 不确定n=log n, q=2,a=1 是什么,但是是的,第三个循环运行的次数呈几何级数增加——1、2、4、8、16、...、n——总和为以 2n 为界。
  • 几何级数之和为a1 * (q^n -1) / q-1。这里 q=2 和 n=log n.. 所以总的来说它是 n-1.. 但我不必将它乘以 log n 两次吗?
  • 不,外循环只有一次,因为它独立于其他两个循环。几何级数源于内环和中环的耦合,而不仅仅是内环本身。

标签: loops time-complexity big-o


【解决方案1】:

理论上你是正确的,复杂度是n*(log(n))^2

对于实际让我们迭代 n=1000:

i = 1; n= 1000; j= 1;k =1; result = 0
while i<=n:
    j=1
    while j<=n:
        k=1
        while k<=j:
            result = result+1
            k = k+1
        j = j*2
    i = i*2
print(result)

我们得到结果 = 10230

所以我们使用floor(logn)+1) * (2 ^ floor(logn)+1) - 1) 公式得到的实际结果值。对于 n=1000,它是 10*(2^10-1)

对于 n=2^25 我们得到结果 1744830438 也满足使用公式= 26*((2^26)-1) = 1744830438。

【讨论】:

  • 检查 n = 2^25 的解决方案:/
  • @MortezaJalambadani 为 2^25 编辑和添加,您能否更清楚地说明您指的是哪个案例?谢谢你提出这个问题。
  • (floor(logn)+1) - 1floor(logn) 有什么区别?
  • 让 x = floor(logn)+1 然后公式为 x * ((2^x) -1) 。所以减法将来自幂 2 的结果。我正在编辑更多大括号以阐明计算中的优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多