我正在尝试计算泡泡排序的θ符号,但我卡住了。给定此过程(伪代码):
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)?
谢谢!
答案 0 :(得分:3)
请记住,这是关于渐近行为。
我们可以将其视为玩游戏:你的目标是证明一定的约束力。游戏是这样的:首先,你可以选择常量C1
和C2
。然后我选择了一个任意的n
。如果我能以违反不平等的方式做到这一点,你就会失败(界限不成立)。如果我无法做到这一点,即使您不再允许更改您选择的C1
和C2
,您也会获胜(绑定是正确的)。
现在让我们看看有问题的等式:
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}}这两个样本足以证明这一点;对于更复杂的方程式,建立边界通常需要更多的工作)。
有了这些知识,你能以一种我永远无法赢得比赛的方式选择n
和C1
吗?
答案 1 :(得分:1)
我们有兴趣找到C1
和C2
,以便每个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
。
最后一点说明:上面显示了一些常量C1
和C2
,n >= 1
时不等式总是保持不变。如果它更方便,我们可以专注于n
的值,从另一个常量值(而不是1
开始,例如n >= 10000
)。重要的是有一些常量C1
和C2
,这样当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
现在如果它满足,那么考虑小于该值的值。这样你就可以获得紧张的约束。如果它不满足更高的价值。这有助于许多情况。