评估给定Bubblesort算法的平均时间复杂度。


11

考虑冒泡的伪代码:

FOR i := 0 TO arraylength(list) STEP 1  
    switched := false
    FOR j := 0 TO arraylength(list)-(i+1) STEP 1
        IF list[j] > list[j + 1] THEN
            switch(list,j,j+1)
            switched := true
        ENDIF
    NEXT
    IF switched = false THEN
        break
    ENDIF
NEXT

在评估平均时间复杂度时,我必须牢记的基本思想是什么?我已经完成了最坏情况和最佳情况的计算,但是我一直在认真思考如何评估内循环的平均复杂度,以形成方程。

最坏的情况是:

i=0n(j=0n(i+1)O(1+Ø1个=Øñ22+ñ2=Øñ2

其中,内部sigma代表内部回路,外部sigma代表外部回路。我认为由于“ if-then-break”子句可能会影响外部sigma,但由于内部循环中的if-子句,我需要同时更改两个sigma。 (如果为true,则为4个动作+ 1个比较,否则为1个比较)。

为了澄清术语“平均时间”:此排序算法在不同列表(相同长度)上将需要不同的时间,因为该算法可能需要在循环中/循环内执行更多或更少的步骤,直到列表完全井然有序。我试图找到一种数学的(非统计方式)来评估所需回合的平均值。

为此,我希望任何命令都具有相同的可能性。


6
您首先需要定义平均数的含义。由于该算法是确定性的,因此您必须假设某种在输入上的分布。
Suresh'3

@Sim可以显示如何计算最坏情况下的时间复杂度吗?然后,我们可能会了解您的情况下平均复杂度的含义。
2012年

我指的是平均时间,指的是最可能需要的时间(或换句话说,是“纯”数学版本:进行统计分析时观察到的所有时间的平均值)。例如,即使快速排序的最坏情况是n ^ 2,也确实具有nlogn的平均值。
2012年

1
@Sim在冒泡排序平均情况下=最坏情况下的时间复杂度,即平均情况下时间复杂度也是ñ2
0x0

3
有区别。quicksort被平均为“在选择枢轴时选择抛硬币”,与数据无关。然而,这意味着要对“所有输入”取平均,这假设(例如)您希望输入的每个排序均以相同的概率发生。这是合理的,但应明确说明。
Suresh'3

Answers:


9

对于长度为列表,通常通常意味着您必须从所有n的均匀分布开始[ 1,..,n ]的排列:这就是您要考虑的所有列表。nn!1n

这样,您的平均复杂度将是所有列表的步数之和除以n!

对于给定的列表,算法的步数为,其中是元素与他的正确位置之间的最大距离(但仅当它必须向左移动时),即。(xi)id x i i max imax 1 i x inddX一世一世最大值一世最大值1个一世-X一世

然后进行数学计算:对于每个找到具有此特定最大距离的列表数,则的期望值为:c d ddCdd

1个ñ d=0ñ dCd

这是最基本的想法,没有发现最困难的部分。也许有一个更简单的解决方案。Cd

编辑:添加了“预期”


如果考虑正态分布,有没有办法近似?Cd
2012年

您可以说因为您可以将[,.., ]的所有排列混合在一起并在末尾附加,但这对于证明的平均值很小。2 d 1个Ñ ²cd(n+1个-dd-1个2d1个ñ²
jmad 2012年

19

回想一下,如果且,则对(resp。)被反转。i j i < j A [ i ] > A [ j ]一种[一世]一种[Ĵ]一世Ĵ一世<Ĵ一种[一世]>一种[Ĵ]

假设您的算法为每个反转执行一次交换,则算法的运行时间将取决于反转次数。

在均匀随机排列中计算预期的反转次数很容易:

令为置换,令为。例如,如果则。- [R P P P = 2 1 3 4 - [R P = 4 3 1 2P[RPPP=21个34[RP=431个2

对于每对索引,或一个恰好存在一个倒数。P R P 一世ĴP[RP

由于对的总数为,并且总数和每一对在正好一半的排列中反转,因此假设所有排列的可能性均等,则预期的反转数为:ññ-1个/2

ññ-1个4

这将评估反转的数量。但是比较的数量如何,具体取决于中断条款进入的时间– 2012
Sim

通过交换可以获得一次比较,最重要的是,一次交换最多可以减少一次反转。
jmad 2012年

并非每个比较都会导致交换,如果if子句为false,则不会进行反转。
2012年

@rgrig如果您提供了反示例,那么我将纠正我的答案。
2012年

@乔:我删除了我的评论。那是错的。
rgrig 2012年

2

交换次数<迭代次数(在优化和简单冒泡情况下)

反转数=交换数。

因此,迭代次数> ññ-1个4

因此,平均情况复杂度为 。但是,由于平均情况不能超过最坏情况,因此我们得出它是O n 2ωñ2Øñ2

这给我们:平均时间= θñ2

(时间复杂度=迭代次数>迭代次数>交换次数)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.