根据Big theta分析时间复杂度

时间:2018-03-17 10:36:54

标签: complexity-theory

我一直试图设置关于迭代和i然后j的清晰信息,但是当我试图弄清楚while循环时我会陷入困境? 有人可以给我一些关于如何解决这样的问题的信息吗?

2 个答案:

答案 0 :(得分:2)

免责声明:这个答案冗长且过于冗长,因为我想为OP提供“婴儿步骤”方法,而不是结果。我希望她能从中找到一些帮助 - 是否需要它。

如果您在尝试一次性获得复杂性时遇到困难,可以尝试将问题分解为更容易推理的小块。 在这种情况下,引入符号可以帮助构建您的思维过程。

  1. 让我们为内部while循环引入一个表示法。我们可以看到起始索引j取决于n - i,因此此循环执行的操作数将是ni的函数。让我们用G(i, n)表示这个操作数。

  2. 外部循环仅取决于n。我们用T(n)表示操作次数。

  3. 现在,让我们记下T(n)G(n, i)之间的依赖关系,仅推断外部循环 - 我们不关心此步骤的内部while循环,因为我们已经在函数G中抽象了它的复杂性。所以我们选择:

    T(n) = G(n, n - 1) + G(n, n - 2) + G(n, n - 3) + ... + G(n, 0) = sum(k = 0, k < n, G(n, k))

  4. 现在,让我们关注函数G

    • 让我们引入一个额外的表示法,并在j(t)循环执行的j次迭代中写下t索引while的值。
    • 让我们调用k违反了while循环不变量的t的值,即最后一次评估条件。
    • 让我们考虑任意i。如果有帮助,您可以尝试使用i的几个特定值(例如1,2,n)。
  5. 我们可以写:

        j(0) = n - i
        j(1) = n - i - 3
        j(2) = n - i - 6
         ...
    j(k - 1) = n - i - 3(k - 1)   such that j(k-1) >= 0 
        j(k) = n - i - 3k         such that   j(k) < 0
    

    查找k涉及解决不等式n - 1 - 3k < 0。为了更容易,让我们“忽略”k是一个整数的事实,我们需要取下面结果的整数部分。

    n - i - 3k < 0 <=> k = (n - i) / 3
    

    因此需要考虑(n - i) / 3个“步骤”。通过步骤,我们在这里指的是循环条件的评估次数。执行操作j <- j - 3的次数将是后者减去一次。

    所以我们找到了G(n, i)的表达式:

    G(n, i) = (n - i) / 3
    

    现在让我们回到我们在(3)中找到的T(n)的表达式:

    T(n) = sum(k = 0, k < n, (n - k) / 3)
    

    由于k从0变为n时,n - kn变为0,我们可以将T(n)等效地写为:

    T(n) = sum(k = 0, k <= n, k / 3)
         = (1/3).sum(k = 0, j <= n, k)
         = (1/6).n.(n+1)
    

    因此你可以用

    结束
    T(n) = Theta(n^2)
    

    此分辨率展示了一些模式,您可以从中创建自己的配方来解决类似的练习:

    • 考虑各个级别的操作次数(一次一个循环),并为代表它们的函数引入符号;
    • 查找这些功能之间的关系;
    • 找出最内部函数的代数表达式,它不依赖于您引入的其他函数,并且可以从循环不变量计算步数;
    • 使用这些函数之间的关系,找到堆栈中较高函数的表达式。

答案 1 :(得分:1)

为了计算代码的所有时间复杂度,用求和替换每个循环。此外,请考虑自(n - i)/3以来第二个循环运行j,步长为3。所以我们有: