Randomized QuicksortにO(n log n)のワーストケースランタイムコストがあるのはなぜですか


18

ランダムクイックソートは、ピボットエレメントがランダムに選択されるクイックソートの拡張機能です。このアルゴリズムの最悪の場合の時間の複雑さは何ですか。私によると、それがあるべきであるO(n2)ランダムに選択されたピボットが選択される場合、最悪の場合に起こるように、ソートまたは逆ソート順序。しかし、いくつかのテキスト[1] [2]では、最悪の場合の時間の複雑さはO(nlogn)

何が正しいの?


3
あなたはこの「テキスト」について話しているはずです。そこに隠された何かがあります。この「テキスト」をもう一度読むと、それを見つけるでしょう
-AJed

注:リンク[1]は無効です。リンク[2]は、アルゴリズムがランダム化されていることを明確に示しているため、入力には「ランタイム」ではなく「予想されるランタイム」があります。そして、最悪の入力に対して予想される実行時間はO(n log n)です。
gnasher729

回答:


18

両方のソースは、の「最悪の予想実行時間」を参照していますこれは予想される所要時間を指していると思いますが、これは絶対的な最悪の場合とは異なります。O(nlogn).

クイックソートには通常、絶対最悪の時間要件があります。最悪のケースは、すべてのステップで、パーティションプロシージャが長さnの配列をサイズ1n 1の配列に分割するときに発生します。ピボット要素のこの「不運」選択が必要O N に至る、再帰呼び出しをO N 2ワーストケース。O(n2)n1n1O(n)O(n2)

O(nlogn)

編集:

O(n)Θ(nlogn)


したがって、一般に、最悪の場合は二次関数として動作すると言うことができます
-Atinesh

Θ

O(n2).

4
Θ(nlogn)

6

これらのテキストは、「最悪の場合のランタイム」ではなく、「最悪の場合の予想実行時間」について述べていることを忘れていました。

彼らは、ランダム要素を含むクイックソートの実装について議論しています。通常、決定論的アルゴリズムがあります。これは、指定された入力に対して常にまったく同じステップを生成するアルゴリズムです。「最悪の場合のランタイム」を判別するには、可能なすべての入力を調べ、最悪のランタイムを生成する入力を選択します。

しかし、ここにはランダムな要因があります。何らかの入力が与えられると、アルゴリズムはランダム性が関係するため常に同じステップを実行するとは限りません。固定入力ごとにランタイムを使用する代わりに、「予想ランタイム」を使用します。ランダム決定の可能性のある各値とその確率をチェックし、「予想ランタイム」はランダム決定の各組み合わせのランタイムの加重平均です、それでも固定入力用。

したがって、考えられる各入力に対して「予想ランタイム」を計算し、「最悪の場合の予想ランタイム」を取得するために、予想ランタイムが最悪の場合に考えられる1つの入力を見つけます。そして明らかに、彼らは「期待される実行時」の最悪のケースはただのO(n log n)であることを示した。最初のピボットをランダムに選択するだけで、ワーストケースの予想ランタイムがo(n ^ 2)(ビッグOの代わりにリトルo)に変更されても、nピボットのうち少数が最悪ケースにつながるので驚かないでしょう動作。


2

入力の順列とピボット(パーティションごとに1つ)の2つのことを期待/平均することに注意してください。

nΘ(nlogn)

Θ(nlogn)

結論として、ソースを使用して、どの実装を使用し、ランダムな応答と見なす量を確認します。分析で修正されました。


私が試験で尋ねたこの質問postimg.org/image/fiurc4z87を考えてください 。どのような適切なansを提案しますか(c)
Atinesh

1
@Atinesh私の答えは、これに関する十分な情報を提供すると思います。
ラファエル

-1

O(n2)

ランダム化クイックソートの最悪のケースは、入力と同じ要素です。例:2,2,2,2,2,2

T(n)=T(n1)+nO(n2)


これは、クイックソートの非常に巧妙な実装がある場合です。第1仕切交換#1、#6、#2、#5、#3、#4、および長さ3のあろう次いでソート2個のサブアレイ内の任意のまともな実装意志
gnasher729

LHSとRHSからスキャンする両方のポインターに<=と> =があると思います。それがあなたがそう言っている理由です。「=」は、両方ではなく、いずれかのポインターに関連付けられています。その場合、再帰ツリーはnまで成長します。
pratyay 16

そして、それは私が非常に巧妙な実装と呼ぶものです。「すべての要素が等しい」場合に2次ランタイムを実行する実装は、犯罪的に愚かです。この場合、実際には線形時間がかかる実装があります(O(n log n)ではなく、O(n))。
gnasher729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.