气泡排序中的预期交换次数


14

给定一个由整数组成的数组,可以以一定的概率,将数组中的每个元素增加固定数量。我必须找到使用气泡排序对数组进行排序所需的交换次数。一种ñbp[一世]0一世<ñ

我尝试了以下方法:

  1. 一个元素的概率用于可以很容易地从给定的概率来计算。一种[一世]>一种[Ĵ]一世<Ĵ

  2. 使用上述方法,我计算出了预期的交换次数为:

    double ans = 0.0;
    for ( int i = 0; i < N-1; i++ ){
        for ( int j = i+1; j < N; j++ ) {
            ans += get_prob(A[i], A[j]); // Computes the probability of A[i]>A[j] for i < j.
    

基本上,我之所以这么想是因为可以通过数组的反转次数来计算预期的交换次数。因此,通过利用给定的概率,我正在计算是否将数字与数字交换。A [ j ]一种[一世]一种[Ĵ]

请注意,初始数组元素可以按任何顺序排列,排序或不排序。然后,每个数字都可能以某种概率发生变化。在此之后,我必须计算预期的交换次数。

我之前曾发布过类似的问题,但它没有所有限制。

关于我是否在正确的轨道上,我没有得到任何好的提示,因此在这里列出了所有限制。如果我以错误的方式考虑问题,请给我一些提示。


6
标题中的可爱tpyo。
JeffE

您的意思不是说给N个整数排序后的数组,每个元素...而且似乎缺少初始数组中数字的范围以及它们之间的差(相对于b)。
丹尼·瓦洛德

请记住,对于这种分析,如果您考虑使用Bubblesort的想法,则必须非常清楚地说明什么特定的“实现”。最好以伪代码给出算法。
拉斐尔

这个问题来自codechef网站codechef.com/JULY12/problems/LEBOBBLE上正在进行的竞赛, 我很乐意在竞赛后发布自己的方法。
rizwanhudda'7

Answers:


11

定义如下:übbË小号Ø[RŤ

for (j = A.length; j > 1; j--)
    for (i = 0; i < j - 1; i++)
        if (A[i] > A[i + 1])
            swap(i, i + 1, A)

给定一些排列,如果对于某些i < j,x j < x i,则发生了反转我们看到,ü b b Ë 小号ö ř 执行用于每一对的反转检查,并且如果是这样,执行一个交换。令X为掉期数。不难看出最坏的情况是X1个XñXĴ<X一世一世<ĴübbË小号Ø[RŤX XBubbleSortX=ñ2可能的交换。但是我们对预期的情况很感兴趣,可以通过根据的反转定义来进行计算。XübbË小号Ø[RŤ

现在,让其中是指示变量,该变量对存在一些对。期望定义为。现在我们需要确定。ĴĴ ë [ X ] = ë [ Σ Ĵ Σ < ĴĴ ] = Σ Ĵ Σ < Ĵ ë [ Ĵ ] P { I i j }X=Ĵ一世<Ĵ一世一世Ĵ一世一世Ĵ一世ĴË[X]=Ë[Ĵ一世<Ĵ一世一世Ĵ]=Ĵ一世<ĴË[一世一世Ĵ]P{一世一世Ĵ}

当假设任何可能的排列作为输入时,每个排列具有均匀的概率,则可以证明。这背后的原因是,在任何可能的排列下,对于,一半的时间和一半的时间。P{一世一世Ĵ}=1个2XĴ<X一世X一世<XĴ一世Ĵ

回到期望计算,我们看到Ë[X]=Ĵ一世<ĴË[一世一世Ĵ]=Ĵ一世<Ĵ1个2=ñ21个2=ññ-1个4

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.