计算大Theta表示法冒泡排序

时间:2017-08-30 14:18:26

标签: algorithm sorting time-complexity bubble-sort

我正在尝试计算泡泡排序的θ符号,但我卡住了。给定此过程(伪代码):

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&lt; =(n ^ 2/2)+(n / 2)&lt; = C2n ^ 2

将双方除以n ^ 2,我们得到:

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

这是我迷路的地方。在书中,作者挑选了一些数字,将它们插入并说“因此它遵循p(n)=Θ(n ^ 2)”

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

好的,现在这是一个开始。让我们看看当n更大时会发生什么...请注意,n仅出现在分母中。因此,我不能通过使它任意大而陷入困境。最糟糕的情况实际上是n。随着n更大的值,产品的第二部分变小并最终消失。对于限制n->inf,我们得到:

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

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

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

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

答案 1 :(得分:1)

我们有兴趣找到C1C2,以便每个n >= 1都符合以下条件:

C1 <= (1 / 2) + (1 / 2n) <= C2

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

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

最后一点说明:上面显示了一些常量C1C2n >= 1时不等式总是保持不变。如果它更方便,我们可以专注于n的值,从另一个常量值(而不是1开始,例如n >= 10000)。重要的是有一些常量C1C2,这样当n足够大时,两个不等式都会成立。

答案 2 :(得分:0)

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

这种方式只是插件n^2现在如果它满足,那么考虑小于该值的值。这样你就可以获得紧张的约束。如果它不满足更高的价值。这有助于许多情况。