【问题标题】:Calculate Big Theta Notation Bubble Sort计算大 Theta 表示法冒泡排序
【发布时间】:2018-02-08 07:34:19
【问题描述】:

我正在尝试计算冒泡排序的 theta 符号,但我遇到了困难。给定这个过程(伪代码):

procedure BUBBLE_SORT(A,n) {
    array A(1 to n)
    for (int i = 1; i <= n; i++) {
        for(int j = 1; j <= n-1; j++) {
            if(A[j] > A[j+1] {
                //swap(A(j), A(j+1))
            }
        }
    }
}

我能够使用 sigma 表示法获得最坏情况下的运行时间:

(n^2 - n) / 2

为了最好的案例运行时间,我按照我的书做了这个:

给定 p(n) = (n^2 - n) / 2,我们声称 p(n) = Θ(n^2)。为了证明这一点,我们展示了对于一些常数 c1、c2 和 n0:

C1n^2

两边除以n^2,我们得到:

C1

这就是我迷路的地方。书中作者挑出一些数字,插上去说“因此得出p(n) = Θ(n^2)”

我如何知道要插入哪些数字?我可以插入任何数字吗?如果这些数字确实符合不等式,这是否意味着我可以立即说算法是 Θ(n^2)?

谢谢!

【问题讨论】:

  • 哎呀你是对的!感谢您指出。立即编辑

标签: algorithm sorting time-complexity bubble-sort


【解决方案1】:

我们有兴趣找到C1C2,这样每个n &gt;= 1 都成立:

C1 &lt;= (1 / 2) + (1 / 2n) &lt;= C2

C1 = 1/2 的一个不错的选择(但任何小于该值的严格正值也是有效的,例如 C1 = 0.1)。

C2 = 1 是一个不错的选择(但任何大于该值的值也是有效的)。 C2 = 1 的值很好,因为表达式1 / 2 + 1 / 2n 随着n 变大而减小,因此它的最大值是n = 1


最后一点:上面显示了一些常量C1C2,当n &gt;= 1 时,不等式总是成立。如果更方便,我们可以关注从另一个常量值开始的n 的值(而不是1,例如n &gt;= 10000)。重要的是有一些常数 C1C2 以便当 n 足够大时两个不等式都成立。

【讨论】:

    【解决方案2】:

    请记住,这是关于渐近行为。

    我们可以将其视为玩游戏:您的目标是证明某个界限成立。游戏是这样进行的:首先,您可以选择常量C1C2。然后我可以选择一个任意的n。如果我能以违反不等式的方式做到这一点,你就输了(界限不成立)。如果我无法做到这一点,即使您不再被允许更改您选择的C1C2,您也赢了(界限是正确的)。

    现在让我们看看有问题的等式:

    C1

    由于n 是一个整数(最后,它表示数组中元素的数量),因此有一个确定的最小值:n = 1。让我们将其替换为:

    (1 / 2) + (1 / 2) = 1

    好的,现在开始。让我们看看当我将n 变大时会发生什么...注意n 只出现在分母中。所以我不能把你的界限弄得乱七八糟。对您来说最糟糕的情况实际上是 small 值为n。随着n 的值越大,产品的第二部分变得越小并最终消失。对于限制n-&gt;inf,我们得到:

    lim n->inf (1 / 2) + (1 / 2n)

    (1 / 2) + lim n->inf (1 / 2n) = (1 / 2) + 0 = 1 / 2

    所以这告诉我们的是,无论我选择 n 的哪个值,结果值将始终在 1/2 到 1 的范围内(因为等式在 n 中是线性的这两个样本足以证明这一点;对于更复杂的方程,建立边界通常需要更多的工作。

    有了这些知识,你能以我永远无法赢得比赛的方式选择C1C2吗?

    【讨论】:

    • 感谢您的清晰解释 :) 我们在计算 Θ 时总是取 n = 1 吗?并且表明存在边界 C1 和 C2 足以说它是 Θ(n^2)?如果说我能找到一个例外,那会不会使它不是 Θ(n^2)?
    • Q1:你需要弄清楚函数的渐近行为,所以通常你只对大ns感兴趣。最后,您不必从字面上选择常量,您只需证明它们存在即可。 Q2:如果对于您选择的每个C1C2,我总能找到一个违反不等式的n,则界限为假。当然,如果您在选择它们时做得很糟糕,我总能想出一个 n。但是由于我们在这里处理的是存在性证明,因此足以表明可以以一种我永远不会赢的方式选择 C1 和 C2,无论我选择哪一个。
    • 谢谢!很好的解释:)
    【解决方案3】:

    我遵循的一般方法是首先检查标准复杂度值。喜欢 2^(2^n) &gt; n! &gt; 4^n &gt; 2^n &gt; n^2 &gt; nlogn &gt; log(n!) &gt; n &gt; sqrt(n) &gt; (logn)^2 &gt; logn &gt; loglogn &gt; 1

    这种方式只是插件n^2 现在如果它满足然后考虑小于那个值。这样你就可以得到紧密的约束。如果它不满足,请选择更高的值。这在很多情况下都有帮助。

    【讨论】:

    • @Katrina.:我实际上提到了插件的合理值......就是这样。
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2012-02-17
    • 2013-09-04
    • 2013-11-02
    • 2018-04-25
    • 2016-11-01
    • 2015-01-17
    • 2013-03-08
    相关资源
    最近更新 更多