【问题标题】:Big Theta complexity for simple algorithm简单算法的大 Theta 复杂度
【发布时间】:2016-02-28 10:24:34
【问题描述】:

我有以下代码,必须确定大的 theta 复杂度

for i =1 to n do
    for j = 1 to n do
        k=j
        while k<= n do
           k = k*3
        end while
    end for
end for

很容易看出,前两个 for 循环各运行 n 次,但 while 循环让我失望了。它第一次运行 log3(n) 次,但在那之后我真的不知道了。 谁能帮忙?

【问题讨论】:

    标签: pseudocode big-theta


    【解决方案1】:

    设 T 为运行时间。很明显 T 是 Ω(n2)。我们可以使用Stirling's Approximation 来扩展ln n!要得到 T = ∑ij ⌈lg3(n/j)⌉ = n * O(∑j ln n - ln j + 1) = n * O(n ln n - ln n! + n) = n * O(n ln n - (n ln n - n + O(ln n)) + n) = O (n2)

    因此 T = Θ(n2)

    【讨论】:

      【解决方案2】:

      不使用重量级数学的解决方案:

      把问题转过来:不要考虑第一次运行内部循环,而是考虑最后一次:它只运行一次。事实上,对于j 的大多数值,最里面的循环只运行一次

      当 j > n/3 时运行一次,即对于 j 的 2n/3 个值
      它在 n/9 当 n/27 当 n/81 ...

      最内层循环运行的总次数将是

      1 * 2n/3 + 2 * 2n/9 + 3 * 2n/27 + 4 * 2n/81 + ... = 2n(1/3 + 2/9 + 3/27 + ... )

      很容易看出系列Sum[k/3^k] 收敛(比率测试)。因此 j 循环在 O(n) 时间内运行,而整个过程在 O(n²) 时间内运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2016-03-17
        相关资源
        最近更新 更多