web-dev-qa-db-ja.com

Quickselectの平均実行時間

ウィキペディアは、クイック選択アルゴリズム( Link )の平均実行時間はO(n)であると述べています。しかし、どうしてそうなのか、はっきりと理解できませんでした。平均ランタイムがO(n)である方法について誰かが(繰り返し関係+マスターメソッドの使用を介して)私に説明できますか?

30
Ravi

なぜなら

目的の要素がどのパーティションにあるかは既にわかっています。

すべての要素を(パーティションを作成して)ソートする必要はありませんが、必要なパーティションでのみ操作を実行します。


クイックソートの場合と同様に、パーティションを半分に分割する必要があります*、次に半分に分割する必要がありますが、今回は、次のラウンドパーティションを1つに作成するだけです単一パーティション(半分)要素が存在すると予想される2つ。

それは(あまり正確ではない)のようです

n + 1/2 n + 1/4 n + 1/8 n + ..... <2 n

つまり、O(n)です。

半分は便宜上使用されており、実際のパーティションは正確な50%ではありません。

41
Dante May Code

クイックセレクトの平均的なケース分析を行うには、アルゴリズム中に2つの要素が比較される可能性がどれほどあるかを考慮する必要があります要素のすべてのペアについておよびランダムピボットと仮定します。これから、比較の平均数を導き出すことができます。残念ながら、これから説明する分析では、より長い計算が必要ですが、現在の回答とは対照的に、クリーンな平均ケース分析です。

k番目に小さい要素を選択するフィールドが_[1,...,n]_のランダム置換であると仮定します。アルゴリズムの過程で選択するピボット要素は、特定のランダム置換と見なすこともできます。次に、アルゴリズムの実行中に、常にこの順列から次の実行可能なピボットを選択します。したがって、すべての要素がランダム順列の次の実行可能な要素と同じ確率で発生するため、ランダムに均一に選択されます。

1つの単純でありながら非常に重要な観察があります。2つの要素ij(_i<j_を使用)を比較するのは、それらの1つが最初のピボット要素として選択されている場合のみです。 [min(k,i), max(k,j)]の範囲から。この範囲から別の要素が最初に選択された場合、要素_i,j_の少なくとも1つが含まれていないサブフィールドで検索を続けるため、それらは決して比較されません。

上記の観察とピボットがランダムに均一に選択されるという事実のため、ijの比較の確率は次のとおりです。

2/(max(k,j) - min(k,i) + 1)

max(k,j) - min(k,i) + 1の可能性から2つのイベント。)

分析を3つの部分に分割します。

  1. max(k,j) = k、つまり_i < j <= k_
  2. min(k,i) = k、つまり_k <= i < j_
  3. min(k,i) = iおよびmax(k,j) = j、したがって_i < k < j_

3番目のケースでは、最初の2つのケースでそれらのケースをすでに検討しているため、等号が小さい記号は省略されています。

さて、計算に少し手を加えましょう。これにより、予想される比較数が得られるため、すべての確率を合計します。

事例1

事例2

ケース1と同様に、これは演習として残ります。 ;)

事例3

ln(r)のように大きくなるr次の調和数には_H_r_を使用します。

結論

3つのケースすべてで、予想される比較の線形数が必要です。これは、quickselectが実際にO(n)で予期されるランタイムを持っていることを示しています。すでに述べたように、最悪のケースはO(n^2)であることに注意してください。

注:この証明のアイデアは私のものではありません。これはおおよそ、クイックセレクトの標準的な平均ケース分析だと思います。

エラーがある場合はお知らせください。

26
maybeshewill

指定されたクイックセレクトでは、パーティションの半分のみに再帰を適用します。

平均ケース分析:

最初のステップ:T(n cn + T(n/2))==

ここで、cn =パーティションを実行する時間。cは任意の定数です(重要ではありません)。
T(n/2)=パーティションの半分に再帰を適用します。
これは平均的なケースであるため、パーティションが中央値であると想定します。

再帰を続けると、次の方程式が得られます。

T(n/2 cn/2 + T(n/4)
T(n/4)= cn/2 + T(n/8)



T(2)= c.2 + T(1)
T(1)= c.1 + ...
)==

方程式を合計し、同様の値を相互キャンセルすると、線形の結果が生成されます。

c(n + n/2 + n/4 + ... + 2 + 1 c(2n))==// GPの合計

したがって、それはO(n)です。

5
Aditya