ピボットとして平均を使用すると、クイックソートがスピードアップしますか?


7

どういうわけか私は昨夜クイックソートについて考え、ウィキペディアでそれについて読んでいました。私にとって興味深い部分は、次のとおりです。「ピボットを中央の50%から一貫して選択できれば、リストを最大で分割するだけで済みます。ピボットの選択は、動作につながる可能性があるクイックソートの1つの考えられる問題のようです。log4/3nO(n2)

私の考えは、各ステップでパーティションの平均値をピボットとして使用すると、速度が大幅に向上する可能性があります。特にいくつかのステップの後、外れ値がリストの独自の区分にある場合、平均と中央値は互いに非常に近いはずです(もう一度、大きなリストを見てください)。各ステップで平均を計算するための追加の時間はなければなりません。したがって:n

クイックソートの推定時間:nAlog4/3n

Quicksort_meanの推定時間:2nAlog5/3n

(5/3は、私が控えめに見積もる可能性が高いです。サブセットは外れ値がないため、すぐに2に近づく可能性があります)。したがって、約10,000エントリから開始すると、Quicksort_meanは(平均して)Quicksortよりも高速になります。さらに、スタックの最小要素または最大要素をとらないようにバインドされているため、になるリスクは決してありません。O(n2)

私の主な質問は次のとおりです。何か見逃しましたか?私は認めなければなりません、私は自分でクイックソートを実装したことがないので、全体の他の部分(ストレージなど)を見逃す可能性があります


1
その「ランタイム」を取得するために、更新された繰り返しを実際に解決しましたか、それとも追加しただけですか (後者は間違っているでしょう。)n
ラファエル

(免責事項:私がこれを真剣に検討してから長い時間が経過しており、私の知識が古くなっている可能性があります)クイックソートは、最悪の場合の動作をする主要な競合他社よりも2倍速いだけです。最良の場合にクイックソートを大幅に遅くすることで、他のアルゴリズムの代わりにそれを使用する理由がなくなります。

別のnを追加しただけです。私はそれが「間違っている」ことを知っていますが、平均の計算は超高速でなければなりません(nの加算。これは、並べ替えやパーティション分割の数の間に実行できます)。競合他社についての私の知識はあまりよくありません(前述したように、半分眠っている間は完全にランダムな考えでした...)
Johannes Becker

回答:


10

パーティションに平均を使用しても、最悪の場合の動作を防ぐことはできません。入力リストが指数関数的に増加しているときに発生します。入力を検討してください:Ω(n2)

1,n2,n3,,nn

このセットの平均は(漸近的に)なので、可能な限り最悪のパーティションを取得します。数値が整数として表されている場合、リストを格納するためにスペースが必要になることを考えると、これは少し簡単です。しかし、浮動小数点数をソートする場合、このシナリオは考えられます。nn1Ω(n2)

ただし、セットの中央値(またはその他の順序統計量)を時間で計算することは可能であるため、クイックソートの実行時間の保証に本当に関心がある場合は、平均ではなくそれを使用する必要があります。O(n)

ただし、すべての実際的なシナリオでは、平均/中央値を計算する追加のコストが非常に大きいため、ランダムなピボットを選択する方がほとんど常に高速です。


それは平均リストです:D(私はあなたがかなり早く無限に到達するので、あなたは非常に大きな数nを持つことができないでしょう)。私のポイントは、O(n)が自動的にO(n)になるわけではないということでした。比較すると、中央値の計算はA * nであり、Aは1より大きい。比較すると、平均の計算は1 * nに近いはずである。したがって、実行時間の平均が増える可能性があると思います(実行時間の保証にはそれほど関心がありませんでした)。私は認めざるを得ない、すべてが今夜私を一人にしないわけにはいかない一連の考えだった。だから誰かが面白いと思ったときのためにここに置くことにしました...
Johannes Becker

1
最後の段落は非常に重要です。はい、より適切なピボットを選択することで再帰の深さを最適化できますが、コストがかかります。価値があるかどうかを判断するには、厳密な分析が必要です。セジウィックの論文などを参照してください。答えは、多くの場合、「なし」(:あなたは直感されていない、常に唯一のより良いピボットを選択するために支払うが、時々、より単純に選択するため。)。
ラファエル

多くのソート基準には「平均」がありません。たとえば、姓で人のリストをソートします。
gnasher729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.