タグ付けされた質問 「quicksort」


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

4
リンクリストでクイックソートを使用しないのはなぜですか?
クイックソートアルゴリズムは、次のステップに分けることができます ピボットを識別します。 ピボットに基づいてリンクリストをパーティション分割します。 リンクリストを再帰的に2つの部分に分割します。 ここで、最後の要素を常にピボットとして選択すると、ピボット要素(最初のステップ)の識別に時間かかります。O(n)O(n)\mathcal O(n) ピボット要素を特定したら、そのデータを保存し、他のすべての要素と比較して、正しいパーティションポイントを特定します(2番目のステップ)。ピボットデータを保存するため、各比較には時間かかり、各スワップにはO(1 )時間かかります。したがって、n個の要素に対して合計でO(n )時間かかります。O(1)O(1)\mathcal O(1)O(1)O(1)\mathcal O(1)O(n)O(n)\mathcal O(n)nnn したがって、再帰関係は次のとおりです。 は O(n log n )です。これは、リンクリストを使用したマージソートと同じです。T(n)=2T(n/2)+nT(n)=2T(n/2)+nT(n) = 2T(n/2) + nO(nlogn)O(nlog⁡n)\mathcal O(n \log n) それでは、なぜリンクリストのクイックソートよりもマージソートが優先されるのでしょうか。

4
ソートアルゴリズムには推移性が必要ですか
非推移的比較でソートアルゴリズムを使用することは可能ですか?はいの場合、なぜコンパレーターをソートするための要件として推移性がリストされていますか? バックグラウンド: ソートアルゴリズムは、通常、コンパレータ関数C(x、y)に従ってリストの要素をソートします。 C(x 、y)= ⎧⎩⎨− 10+ 1もし X≺Y もし X〜Y もし X≻Y C(バツ、y)={−1もし バツ≺y0もし バツ〜y+1もし バツ≻y\begin{array}{ll} C(x,y) = \begin{cases} -1 & {\text{if}}\ x\prec y \\ 0 & {\text{if}}\ x\sim y \\ +1 & {\text{if}}\ x\succ y \\ \end{cases} \end{array} 私が理解している限り、このコンパレータの要件は次のとおりです。 再帰的: ∀ X :C(x 、x )= 0∀バツ:C(バツ、バツ)=0\forall x: C(x,x)=0 …

2
O(k)メモリO(n)時間のみを使用して、指定されたシーケンスからk番目に小さい要素を見つける
一連のnnn数値を1つずつ読み取るとします。O (k )セルメモリを使用して線形時間(O (n ))でkkk番目に小さい要素を見つける方法。私たちは最初に保存すべきだと思うk個のシーケンスの条件をして取得するときのk + 1番目の用語を、私たちは必ずそれができないことを期削除のk番目に小さい要素[保存" のk + 1番目の用語を。したがって、各ステップでこの使用できない用語を示すインジケーターが必要であり、このインジケーターは各ステップですばやく更新される必要があります。「マックス」から始めましたO(k)O(k)O(k)O(n)O(n)O(n)kkkk+1k+1k+1kkkk+1k+1k+1; しかし、迅速に更新することはできません。つまり、maxを考慮した場合、最初の削除ではmaxを逃し、線形ではないO(k)O(k)O(k)とその原因(n−k)×O(k)(n−k)×O(k)(n-k)\times O(k)時間でmaxを検索する必要があります。おそらく、シーケンスの最初のkkk項をよりインテリジェントに保存する必要があります。 この問題を解決するにはどうすればよいですか?

3
このクイックソートの正当性の証明を理解しようとしています
この証明は帰納法による証明であり、次のようになります。 P(n)は、「クイックソートが長さnのすべての入力配列を正しくソートする」という表明です。 基本ケース:長さ1のすべての入力配列は既にソートされています(P(1)が保持されます) 帰納的ステップ:n => 2を修正します。長さnの入力配列を修正します。 表示する必要があります:P(k)がすべてのk <nに対して成り立つ場合、P(n)も成り立ちます 次に、ピボットpの周りに分割された配列Aを描画します。したがって、彼はpを描画し、配列の<pである部分を最初の部分として呼び出し、> pである部分を2番目の部分として呼び出します。パーツ1の長さ= k1、パーツ2の長さはk2です。(前に提供された)Partitionサブルーチンの正確性の証明により、ピボットpは正しい位置に巻き上げられます。 帰納的仮説:1番目、2番目の部分は再帰呼び出しによって正しくソートされます。(P(K1)、P(k2)を使用) したがって、再帰呼び出しの後、配列全体が正しくソートされます。 QED 私の混乱:これが正確さをどのように証明するかを正確に確認するのに多くの問題があります。したがって、P(k)が実際にすべての自然数k <nに対して成立すると仮定します。 これまでに見た誘導証明のほとんどは、次のようなものです。基本ケースを証明し、P(n)=> P(n + 1)であることを示します。それらは通常、ある種の代数的操作も含みました。この証明は非常に異なっているように見え、誘導の概念をそれに適用する方法がわかりません。私は、Partitionサブルーチンの正確さが鍵であるといくぶん推論できます。したがって、その正確さの理由は次のとおりです。再帰呼び出しのたびに、ピボットの周りで配列が分割されることがわかっています。その後、このピボットはその正しい位置になります。次に、各サブアレイはピボットを中心にさらに分割され、そのピボットは正しい位置に配置されます。これは、長さ1のサブ配列を取得するまで繰り返し行われます。 しかし、P(k)がすべてのk <nに当てはまるとは想定していません。実際にそれを示しています(Partitionサブルーチンは常に1つの要素を正しい位置に配置するため)。Pを想定していませんか? (k)すべてのkに当てはまる

1
ピボットとして平均を使用すると、クイックソートがスピードアップしますか?
どういうわけか私は昨夜クイックソートについて考え、ウィキペディアでそれについて読んでいました。私にとって興味深い部分は、次のとおりです。「ピボットを中央の50%から一貫して選択できれば、リストを最大で分割するだけで済みます。ピボットの選択は、動作につながる可能性があるクイックソートの1つの考えられる問題のようです。log4/3nlog4/3⁡n\log_{4/3} nO(n2)O(n2)O(n^2) 私の考えは、各ステップでパーティションの平均値をピボットとして使用すると、速度が大幅に向上する可能性があります。特にいくつかのステップの後、外れ値がリストの独自の区分にある場合、平均と中央値は互いに非常に近いはずです(もう一度、大きなリストを見てください)。各ステップで平均を計算するための追加の時間はなければなりません。したがって:nnn クイックソートの推定時間:nAlog4/3nnAlog4/3⁡nnA\log_{4/3} n Quicksort_meanの推定時間:2nAlog5/3n2nAlog5/3⁡n2nA\log_{5/3} n (5/3は、私が控えめに見積もる可能性が高いです。サブセットは外れ値がないため、すぐに2に近づく可能性があります)。したがって、約10,000エントリから開始すると、Quicksort_meanは(平均して)Quicksortよりも高速になります。さらに、スタックの最小要素または最大要素をとらないようにバインドされているため、になるリスクは決してありません。O(n2)O(n2)O(n^2) 私の主な質問は次のとおりです。何か見逃しましたか?私は認めなければなりません、私は自分でクイックソートを実装したことがないので、全体の他の部分(ストレージなど)を見逃す可能性があります

2
サブリストがかなりのメモリを占有しているのに、なぜクイックソートが「インプレース」と記述されるのですか?確かにバブルソートのようなものだけが配置されていますか?
クイックソートは「インプレース」と説明されていますが、次のような実装を使用しています。 def sort(array): less = [] equal = [] greater = [] if len(array) > 1: pivot = array[0] for x in array: if x < pivot: less.append(x) if x == pivot: equal.append(x) if x > pivot: greater.append(x) return sort(less) + equal + sort(greater) else: return array 再帰ごとにリストのコピーを作成する必要があります。最初の戻りまでに、メモリには次のようになります。 アレイ 大きい+等しい+小さい …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.