特定のバブルソートアルゴリズムの平均時間の複雑さを評価します。


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)+O(1))=O(n22+n2)=O(n2)

ここで、内側のシグマは内側のループを表し、外側のシグマは外側のループを表します。私は両方のシグマを変更する必要があると思います。これは、外側のシグマに影響を与える可能性のある「if-then-break」節のためだけでなく、ループ中に実行されるアクションに影響を与える内側のループのif節のためにもです(4つのアクション+ trueの場合は1つの比較、それ以外の場合は1つの比較のみ)。

平均時間という用語を明確にするために、この並べ替えアルゴリズムでは、リストが完全に整うまでループ内またはループ内でステップが多少増減する可能性があるため、(同じ長さの)異なるリストでは異なる時間が必要になります。私は必要なそれらのラウンドの平均を評価する数学的(非統計的な方法)を見つけようとします。

このため、どの注文でも同じ可能性があると期待しています。


6
まず、平均値の意味を定義する必要があります。アルゴリズムは確定的であるため、入力に対するある種の分布を想定する必要があります。
Suresh、2012年

@Sim最悪の場合の時間の複雑さを計算した方法を示すことができますか?次に、あなたの場合の平均的な複雑さによってあなたが何を意味するのかについてのアイデアを得るかもしれません。
0x0

私は必要とされる可能性が最も高い時間の方法で平均時間を意味します(または言い換えると、「純粋な」数学バージョンの:統計分析を行って観測されたすべての時間の平均)。たとえば、最悪の場合はn ^ 2ですが、クイックソートの平均はnlognです。
Sim

1
@Simバブルソートの場合、平均ケース=最悪の場合の時間の複雑さ、つまり、平均ケース時間の複雑さもn2
0x0

3
違いがあります。クイックソートは「ピボットを選択するときのコイントスの選択よりも」平均化されており、データとは関係ありません。一方、たとえば、入力の各順序が同じ確率で発生することを想定していると仮定して、「すべての入力に対して」平均化したいことを示唆しています。それは理にかなっていますが、それは明示的に述べられるべきです。
Suresh、2012年

回答:


9

長さリストの、平均は通常、すべてのについて均一な分布から始める必要があることを意味します[、..、 ]の順列:検討する必要があるすべてのリストになります。n 1 nnn!1n

その場合、平均的な複雑さは、すべてのリストのステップ数の合計を割ったものになります。n!

特定のリスト場合、アルゴリズムのステップ数はここで、は要素とその正当な位置(ただし、左に移動する必要がある場合のみ)の間の最大距離、つまり。(xi)inddxiimaxi(max(1,ixi))

そして、あなたは数学の操作を行います。それぞれの番号を見つけるこの特定の最大距離でリストのを、その後の期待値次のとおりです。c d ddcdd

1n! d=0n dcd

そして、それは見つけることの最も難しい部分がない基本的な考え。多分もっと簡単な解決策があります。cd

編集:「期待される」を追加


正規分布を考える場合、を概算する方法はありますか?cd
Sim

あなたはと言うことができます[、..、 ]のすべての順列をどこにでも混ぜて、最後にを追加することができますが、平均してを証明するには小さます。2 D 1cd(n+1d)(d1)!2d1n²
jmad

19

および場合、ペア(それぞれ)が反転することを思い出してください。(A[i],A[j])(i,j)i<jA[i]>A[j]

アルゴリズムが反転ごとに1つのスワップを実行すると仮定すると、アルゴリズムの実行時間は反転の数に依存します。

一様ランダム順列で予測される逆数の計算は簡単です。

LET置換すること、およびlet逆のこと。たとえば、場合、ます。PR(P)PP=2,1,3,4R(P)=4,3,1,2

インデックスペアごとに、またはどちらか一方に反転があります。(i,j)PR(P)

ペアの総数はであり、総数と各ペアは順列のちょうど半分で反転します。すべての順列が等しく可能性があると仮定すると、予想される反転の数は次のとおりです。n(n1)/2

n(n1)4

これは、反転の量を評価します。しかし、break-clauseがステップインされる時間に依存する比較の量はどう
Sim

スワップごとに1つの比較が行われ、最も重要なことは、1つのスワップで反転の数を最大で1つ減らすことができることです。
jmad

すべての比較でスワップが発生するわけではありません。if句がfalseの場合、反転は行われません。
Sim

@rgrig反例を提供した場合、私は私の答えを修正します。
Joe

@Joe:私はコメントを削除しました。それは間違っていました。
rgrig

2

スワップの数<反復の数(最適化されたシナリオと単純なバブルのシナリオの両方)

反転の数=スワップの数。

したがって、反復回数>n(n1)4

したがって、平均的なケースの複雑さは です。しかし、平均的なケースは最悪のケースを超えることができないため、であることがわかります。ω(n2)O(n2)

これにより、平均時間が= θ(n2)

(時間の複雑さ=反復数>反復数>スワップ数)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.