【问题标题】:what is the complexity of this algorithm , can i sum it to infinity?这个算法的复杂度是多少,我可以把它加到无穷大吗?
【发布时间】:2016-03-22 23:52:32
【问题描述】:
Func(n)
{
   i = n
   while(i>=1)
      g(i);
      i = i/3;
}

这个算法的复杂度是多少? (而 g(n) 的复杂度是 theta(n²)) 我假设对于更大的 n,你说复杂度是

n² + (n/3)² + (n/3²)² + (n/3³)²..... 到无穷大。

答案是 theta(n²)。 这是真的吗?

【问题讨论】:

    标签: algorithm loops while-loop time-complexity logarithm


    【解决方案1】:

    如您所见,循环运行如下。

    Iteration 1: n^2 = n^2/3^0
    Iteration 2: (n/3)^2 = n^2/3^2
    Iteration 3: (n/3^2)^2 = n^2/3^4
    Iteration 4: (n/3^3)^2 = n^2/3^6
    ...
    Iteration k: (n/3^(k-1))^2 = n^2/3^(2*(k-1))
    

    使用几何级数求和公式,我们得到总时间为

    T(iteration1) + T(iteration2) + ... + T(Iterationk)

    term 1 = n^2
    ratio = 1/9
    sum = 9 * n^2 / 8 
    

    当 K 是一个可以假定为无穷大的大数时。

    由于大 O 表示法忽略了常量,

    O( 9* n^2 /8) = O(n^2)

    【讨论】:

    • 我可以假设 K 是无穷大吗?
    【解决方案2】:

    让我们看看我们手中的系列。

    => n² + (n²/3) + (n/3)² + (n/3²)² + (n/3³)²..... 
    taking n² common
    => n² * [ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]
    

    由于[ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]是一个递减序列,它等于1

    因此答案是O(n²)


    编辑 1:

    证明[ 1 + (1/3) + (1/3)² + (1/3²)² + (1/3³)²..... ]的系列之和,如下。

    【讨论】:

    • 谢谢!这就是我所做的,我的讲师不接受这个答案。他说总和中的值的数量是 log3(n) 而不是无穷大。我可以假设它的无穷大吗?
    • @yair,不,你不能假设它是无限的,因为有 log3(n) 值。但是你可以说这个系列的总和是1,或者< 2,就像在这种情况下一样。
    • 递减级数必须无穷大,如果我想求和,不是吗?如果不是,我必须用正常的几何方程求和,不是吗?
    • @yair,给我一点时间,我会发布证明。
    • @yair,该系列的证明在我发布的图片中。
    【解决方案3】:

    严格来说,i 是一个整数,它很快就变成了 0(在 floor(log3(n) 次迭代之后),所以没有理由去无穷大。

    无论如何,将i 视为一个有理数的结果是不会改变渐近行为的真实公式的近似值,仍然是 O(n²)。近似以两种方式出现

    • i/3 可能与 floor(i/3) 不同;

    • 一个可以加到无穷大;小于 1 的项最差只会加到 4/3,这是完全可以忽略的。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多