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

いくつかの順序関係に関して要素のセットを順序付けるアルゴリズムの問​​題。

11
クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?
標準アルゴリズムコースでは、クイックソートは平均でであり、最悪の場合はであると教えられてい。同時に、最悪の場合(mergesortやheapsortのようなであり、最高の場合(bubblesortのような)線形時間であるが、メモリの追加の必要性がある他のソートアルゴリズムが研究されています。O (n 2)O (n log n )O (n ログn )O(nlog⁡n)O(n \log n)O (n2)O(n2)O(n^2)O (n ログn )O(nlog⁡n)O(n \log n) いくつかの実行時間をひと目見た後、クイックソートは他の効率ほど効率的であってはならないと言うのが自然です。 また、学生は基本的なプログラミングコースで、再帰があまりにも多くのメモリを使用するなどの理由であまり良くないことを学ぶと考えてください。したがって(これは本当の議論ではありませんが)、これはクイックソートがそうではないという考えを与えますそれは再帰アルゴリズムであるため、本当に良いです。 それでは、実際には、クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?実世界のデータの構造に関係していますか?コンピューターのメモリの動作方法に関係していますか?一部のメモリは他のメモリよりもはるかに高速であることは知っていますが、それがこの直感に反するパフォーマンスの本当の理由であるかどうかはわかりません(理論的な推定と比較した場合)。 1更新:正規答えはに関与定数と言っている平均的な場合の、他のに関与する定数よりも小さいアルゴリズム。ただし、直感的なアイデアだけではなく、正確な計算を使用して、これを適切に正当化する方法はまだありません。O (n log n )O (n ログn )O(nlog⁡n)O(n\log n)O (n ログn )O(nlog⁡n)O(n\log n) いずれにせよ、いくつかの答えが示唆するように、メモリレベルでは実装がコンピューターの内部構造を利用し、たとえばキャッシュメモリがRAMよりも速いことを使用して、本当の違いが生じるようです。議論はすでに興味深いものですが、答えはそれに関係しているように思われるので、メモリ管理に関してさらに詳細を見たいと思います。 更新2:ソートアルゴリズムの比較を提供するいくつかのWebページがあり、一部は他よりも洗練されています(最も顕著なのはsort-algorithms.com)。素晴らしい視覚補助を提示する以外に、このアプローチは私の質問に答えません。


8
整数配列の最速のソートアルゴリズムは何ですか?
私は高校時代に多くの分類アルゴリズムに出会いました。ただし、どれが最速かはわかりません(整数のランダム配列の場合)。だから私の質問は: 現在知られている最速のソートアルゴリズムはどれですか? 理論的には、さらに速いものがある可能性はありますか?それで、ソートの最小の複雑さは何ですか?

5
最悪の場合、このソートアルゴリズムはΘ(n³)であり、Θ(n²)ではありませんか?
データ構造とアルゴリズムの講座を始めたばかりで、ティーチングアシスタントは整数の配列を並べ替えるための次の擬似コードを提供してくれました。 void F3() { for (int i = 1; i < n; i++) { if (A[i-1] > A[i]) { swap(i-1, i) i = 0 } } } 明確ではないかもしれませんが、ここではソートしようとしている配列のサイズです。nnnA いずれにしても、ティーチングアシスタントはクラスにこのアルゴリズムは時間(最悪の場合、私は信じている)であると説明しましたが、逆に並べ替えられた配列で何度も調べても、私には、ではなくであるように思われます。Θ (n 2)Θ (n 3)Θ(n3)Θ(n3)\Theta(n^3)Θ(n2)Θ(n2)\Theta(n^2)Θ(n3)Θ(n3)\Theta(n^3) 誰かがこれがΘ(n3)Θ(n3)Θ(n^3)ではなくΘ(n ^ 3)である理由を説明できΘ(n2)Θ(n2)Θ(n^2)ますか?

3
最悪のケース
私は最悪の与えるトラブル発見の良いリソース持っています場所での安定したソートアルゴリズムを。誰かが良いリソースを知っていますか?O(nlnn)O(nln⁡n)O(n \ln n) ただのリマインダーは、渡された配列を使用することを意味し、ソートアルゴリズムは一定の余分なスペースのみを使用できます。安定とは、同じキーを持つ要素が、元の配列と同じ順序でソートされた配列に表示されることを意味します。 たとえば、単純なマージソートは最悪の場合および安定ですが、O (n )の余分なスペースを使用します。標準のクイックソートは安定したものにできますが、適切に配置されていますが、最悪の場合はO (n 2)です。ヒープソートは配置されています。最悪の場合はO (n ln n )ですが、安定していません。 ウィキペディアには、どのソートアルゴリズムにどの欠点があるかを示す優れたチャートがあります。安定性の3つの条件すべて、最悪の場合O (n ln nO (n lnn )O(nln⁡n)O(n \ln n)O (n )O(n)O(n)O (n2)O(n2)O(n^2)O (n lnn )O(nln⁡n)O(n \ln n)および所定の位置にある。O (n lnn )O(nln⁡n)O(n \ln n) Katajainen、Pasanen、Teuholaによる「Practical in-place mergesort」と呼ばれる論文を見つけました。この論文は、最悪の場合がプレースマージソートバリアントにあると主張しています。結果を正しく理解している場合、配列の最初のと配列の最後ので(ボトムアップ?)mergesortを再帰的に使用し、2番目のをマージするためのスクラッチスペースとして。私はまだこれを読んでいるので、結果を正しく解釈しているかどうかについてのさらなる情報はありがたいです。O (n lnn )O(nln⁡n)O(n \ln n)1414\frac{1}{4}1212\frac{1}{2}1414\frac{1}{4} また、安定したクイックソートの最悪のケースにも非常に興味があります。私が理解していることから、クイックソートを最悪のケースO (n ln n )に変更するには、通常は安定性を損なう適切なピボットを選択する必要があります。O (n lnn …

4
「ソート度」の測定方法
配列の「ソート度」を測定する標準的な方法があるかどうか疑問に思っていますか?可能性のある反転の中央値を持つ配列は、最大限にソートされていないと見なされますか?つまり、基本的には、並べ替えまたは逆並べ替えのいずれかが可能な限り行われないということです。

5
ソートされた配列に要素を追加する
これを行うための最速の方法は何ですか(アルゴリズムの観点からも、実際的な問題からも)? 私は次の線に沿って何かを考えていました。 配列の末尾に追加して、これに近いベストケース(開始時に完全にソートされた配列)があり、実行時間が線形である(最適な場合)ので、バブルソートを使用できます。 一方、ソートされた配列から開始することがわかっている場合、バイナリ検索を使用して、指定された要素の挿入ポイントを見つけることができます。 私の考えでは、2番目の方法はほぼ最適ですが、そこに何があるのか​​興味があります。 どうすればこれを最適に行うことができますか?

3
選択ソートがバブルソートよりも速いのはなぜですか?
ウィキペディアには、「...選択ソートはほとんど常にバブルソートおよびGNOMEソートよりも優れている」と書かれています。どちらもバブルソートよりも選択ソートが速いと考えられる理由を誰にでも説明してください: 最悪の場合の時間の複雑さ:O( n2)O(n2)\mathcal O(n^2) 比較の数: O( n2)O(n2)\mathcal O(n^2) 最適な時間の複雑さ: バブルソート:O(n )O(n)\mathcal O(n) 選択ソート:O( n2)O(n2)\mathcal O(n^2) 平均ケース時間の複雑さ: バブルソート:O( n2)O(n2)\mathcal O(n^2) 選択ソート:O( n2)O(n2)\mathcal O(n^2)

6
要素の繰り返しなしでペアのセットから組み合わせを生成する
ペアのセットがあります。各ペアの形式は(x、y)で、x、yは範囲の整数に属します[0,n)。 したがって、nが4の場合、次のペアがあります。 (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) 私はすでにペアを持っています。次に、n/2整数が繰り返されないようにペアを使用して組み合わせを作成する必要があります(つまり、各整数は最終的な組み合わせで少なくとも1回出現します)。理解を深めるための正しい組み合わせと間違った組み合わせの例を次に示します 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] ペアができたら、可能性のあるすべての組み合わせを生成する方法を誰かが提案できますか?

7
アイテムを「均等に」配布するアルゴリズム
結果のリストが可能な限り「バランスの取れた」または「均等に分散」されるように、リストから値を分散するアルゴリズムを探しています(これらがそれを記述するための最良の方法であると確信していないため、引用符で...後で、結果が他の結果よりも良いかどうかを測定する方法を提供します)。 したがって、リストの場合: [1, 1, 2, 2, 3, 3] 値を再配布した後の最良の結果の1つは次のとおりです。 [1, 2, 3, 1, 2, 3] これと同じくらい良い結果が他にもあるかもしれません。もちろん、値のセットが不均一になると、より複雑になります。 これは、結果が他よりも優れているかどうかを測定する方法です。 各アイテムと同じ値を持つ次のアイテム間の距離を数えます。 その距離のセットの標準偏差を計算します。分散が低いほど、より良い結果が得られます。 観察: 距離を計算し、同じ値を持つアイテムを見つけることなくリストの最後に到達すると、リストの最初に戻ります。そのため、多くても同じアイテムが検出され、そのアイテムの距離はリストの長さになります。これは、リストが周期的であることを意味します。 典型的なリストには、さまざまな数量で最大15個の異なる値を持つ最大50個のアイテムがあります。 そう: 結果の[1, 2, 3, 1, 2, 3]場合、距離は[3, 3, 3, 3, 3, 3]であり、標準偏差は0;です。 結果の[1, 1, 2, 2, 3, 3]場合、距離は[1, 5, 1, 5, 1, 5]であり、標準偏差は2;です。 これにより、最初の結果が2番目の結果よりも良好になります(偏差が小さいほど良い)。 これらの定義を考慮して、どのアルゴリズムまたは戦略を検索すべきかの手がかりを求めます。

1
線形プログラムとしてソートする
驚くほど多くの問題が、線形計画法(LP)をかなり自然に削減しています。ネットワークフロー、2者間マッチング、ゼロサムゲーム、最短パス、線形回帰、および回路評価などの例については、[1]の第7章を参照してください。 回路評価は線形計画法に帰着するため、問題には線形計画法の定式化が必要です。したがって、線形プログラムへの還元を介した「新しい」ソートアルゴリズムがあります。だから、私の質問はPPP 実数の配列をソートする線形プログラムとは何ですか?nnn LPへの還元と解決のソートアルゴリズムの実行時間は? S. Dasgupta、C。Papadimitriou、U。Vaziraniによるアルゴリズム(2006)

3
基数ソート
基数ソートでは、最初に最下位桁でソートし、次に2番目に下位桁でソートします。その後、ソート済みリストになります。 数字のリストがある場合、これらの数字を区別するためにビットが必要です。したがって、作成する基数ソートパスの数はなり。各パスは時間かかるため、基数ソートの実行時間はnnnログnlog⁡n\log nログnlog⁡n\log nO (n )O(n)O(n)O (n ログn )O(nlog⁡n)O(n \log n) しかし、線形時間アルゴリズムであることはよく知られています。どうして?

4
5つの要素をソート(順序)するために必要な比較の最小数
5つの要素を並べ替える(順序付ける)ために必要な比較の最小数を見つけ、この比較数を使用してこれらの要素を並べ替えるアルゴリズムを考案します。 解決策: 5つあります!= 120の可能な結果。したがって、ソート手順のバイナリツリーには少なくとも7つのレベルがあります。実際、 ≥120が示す時間 ≥7でも7の比較は十分ではありません。5つの要素を並べ替える(並べ替える)ために必要な比較の最小数は8です。2h2h2^hhhh 私の実際の質問は次のとおりです。8つの比較でそれを行うアルゴリズムを見つけましたが、7つの比較でそれができないことをどのように証明できますか?

4
すべての特定の望ましいプロパティを持つソートアルゴリズムはありませんか?
上のソートアルゴリズムのウェブサイトは、以下の請求が行われます。 理想的なソートアルゴリズムには、次のプロパティがあります。 安定:等しいキーは並べ替えられません。 所定の位置で動作し、追加スペースが必要です。O(1)O(1)O(1) 最悪の場合のキーの比較。O(n⋅lg(n))O(n⋅lg⁡(n))O(n\cdot\lg(n)) 最悪のスワップ。O(n)O(n)O(n) アダプティブ:データがほぼソートされている場合、または一意のキーがほとんどない場合、まで高速化されます。O(n)O(n)O(n) これらのプロパティをすべて備えたアルゴリズムはないため、ソートアルゴリズムの選択はアプリケーションによって異なります。 私の質問は、それは本当ですか これらのすべてのプロパティを持つ[ソート]アルゴリズムはありません もしそうなら、なぜですか?これらすべてが同時に満たすことを不可能にするこれらの特性についてはどうですか?

4
ランダムコンパレータを受け入れるソートアルゴリズム
一般的な並べ替えアルゴリズムは、通常、並べ替えるデータのセットと、2つの個別の要素を比較できる比較関数を受け取ります。コンパレータが順序関係¹の場合、アルゴリズムの出力はソートされたリスト/配列です。 私は、どのソートアルゴリズムが実際には順序関係ではないコンパレーター(特に、各比較でランダムな結果を返すもの)で動作するのか疑問に思っています。「作業」とは、ここでは、入力の順列を返し続け、常に最悪のシナリオに低下したり、無限ループに入ったり、要素が欠落したりするのではなく、通常引用された時間の複雑さで実行されることを意味します。ただし、結果の順序は定義されていません。さらに良いことに、コンパレータがコインフリップの場合、結果の順序は均一な分布になります。 私の大まかな精神的な計算から、マージソートはこれで問題なく、同じ実行時コストを維持し、公平なランダムな順序を生成するように見えます。しかし、クイックソートのようなものは退化する可能性があり、おそらく終了せず、公平ではないと思います。 ランダムコンパレータで説明されているように、他のどのソートアルゴリズム(マージソート以外)が機能しますか? 参考のために、コンパレータは、適切な関数(決定論的)であり、順序関係の公理を満たす場合、順序関係になります。 それは決定論的です。compare(a,b)特定の場合a、b常に同じ結果を返します。 推移的です: compare(a,b) and compare(b,c) implies compare( a,c ) それは反対称です compare(a,b) and compare(b,a) implies a == b (すべての入力要素が別個であると想定しているため、反射性は問題ではありません。) ランダムコンパレータは、これらのすべてのルールに違反します。ただし、順序関係ではないコンパレータはまだランダムではありません(たとえば、おそらく1つのルールに違反している可能性があり、セット内の特定の要素のみに違反している可能性があります)。

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