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

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

3
基数ソートの実用化
キーが特定の制限された範囲にあることがわかっている場合、たとえば[ 0 … n k − 1 ]の範囲の値など、基数ソートは理論的に非常に高速です。場合のk &lt; LG のnあなただけのベースに値を変換するn個とるΘ (n個)の時間を、ベース行うn個のソート基数をして、全体のためにあなたの元のベースに戻って変換するΘ (nはkの)アルゴリズム。nnn[ 0 … nk− 1 ][0…nk−1][0\dots n^k -1]k &lt; lgnk&lt;lg⁡nk<\lg nnnnΘ (n )Θ(n)\Theta(n)nnnΘ (n k )Θ(nk)\Theta(nk) ただし、実際には基数ソートは通常、たとえばランダム化されたクイックソートを実行するよりもはるかに遅いことを読みました。 大規模な配列の場合、基数ソートの命令数は最も少なくなりますが、キャッシュパフォーマンスが比較的低いため、全体的なパフォーマンスは、マージソートおよびクイックソートのメモリ最適化バージョンよりも劣ります。 基数の並べ替えは素晴らしい理論上のアルゴリズムですか、それとも一般的な実用的な用途がありますか?

3
最も効率的な定数空間ソートアルゴリズムは何ですか?
私は配列のサイズ以外のバイトを割り当てず、2つの命令に制限されているint配列のソートアルゴリズムを探しています: SWAP:次のインデックスを現在のインデックスと交換します。 MOVE:カーソルを+1または-1インデックスに移動します。 つまり、indexを交換した100だけでは、隣接していないインデックスを交換したり、インデックスを交換したりすることはできません10。最も効率的なアルゴリズムは何ですか?つまり、総移動量が少ないアルゴリズムですか?

3
1つの配列が他の配列のソートバージョンかどうかを確認する決定論的線形時間アルゴリズム
次の問題を考慮してください。 入力:長さnの 2つの配列AAAおよびここで、Bはソート順です。BBBnnnBBB クエリは:ないAAAとBBB(その多重度)と同じ項目が含まれていますか? この問題の最速の決定論的アルゴリズムは何ですか? それらをソートするよりも速く解決できますか?この問題は確定的な線形時間で解決できますか?

2
最大7つの比較で5つの整数の配列をソートします
最悪の場合に7つの比較が必要になるように、5つの整数のリストをソートするにはどうすればよいですか?他の操作がいくつ実行されるかは気にしません。私は整数について特別なことは何も知りません。 私はマージソートアプローチに従うか、マージソートとバイナリサーチを使用して挿入位置を見つけるなど、8つの比較にまで下がったいくつかの異なる分割統治アプローチを試しましたが、最終的には8つの最悪の場合を比較します。 今のところ、解決策ではなく、ヒントを探しています。

2
Randomized Quicksortの利点は何ですか?
本のRandomized Algorithmsで、 MotwaniとRaghavanは、RandQS関数(ランダム化クイックソート)の説明で導入部を開きます。ここでは、セットを2つの部分に分割するために使用されるピボットがランダムに選択されます。 私はこれまでに(明らかにやや劣っています)頭を悩ませてきましたが、このアルゴリズムが単に毎回(サイズではなくインデックス内の)要素を選択することに比べて、どのような利点があるのか​​わかりませんでした。 私が見ることができないのはこれだと思います:初期セットがランダムな順序である場合、セット内のランダムな場所で要素を選択することと固定位置で要素を選択することの違いは何ですか? 誰かがかなり単純な言葉で私を啓発できますか?

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
クイックソートが子供に説明しました
昨年、私は「幼稚園のための量子力学」に関する素晴らしい論文を読んでいました。簡単な紙ではありませんでした。 今、私は可能な限り簡単な言葉でクイックソートを説明する方法を疑問に思います。平均複雑度がであることを(または少なくとも手波で)どのように証明できますか?または少なくとも小学校では?O(nlogn)O(nlog⁡n)O(n \log n)

2
反転の数を最小限に抑えながらリストに効率的に挿入する
比較可能なアイテムの2つのリストuおよびsを想定します。INV(u)をuの反転数とします。 INV(u)の最小の増加でsの項目をuに挿入する効率的なアルゴリズムを探しています。 基本的に、リストにオブジェクトを挿入し、最初のリストの順序を維持しながら、「可能な限りソートされた」状態に保ちたいと思います。 例: u = [4,6,2,9,7] INV(u) = 3 ((4, 2), (6, 2) and (9, 7) s = [8,3,10] one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10] INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7)) different optimal solution u' …

1
隣人を比較せずにリストのソートを検証できますか?
その隣人にすべてのアイテムを比較することにより、ソートされたよう-itemリストを確認することができます。私のアプリケーションでは、すべてのアイテムをその隣のアイテムと比較することはできません。代わりに、遠くの要素間で比較することがあります。リストに3つ以上の項目が含まれ、また比較がサポートされる唯一の操作であることを考えると、リストがソートされていることを証明する比較の「ネットワーク」が存在しますが、少なくとも1つの隣接する近隣が欠落しています比較?nnn 正式には、要素シーケンスに対して、、、またはかどうかを知っているインデックスのペアがあります。比較のセットから欠落しているペアが存在します。それでは、シーケンスがソートされていることを証明することは可能ですか?e私eie_i(j 、k )(j,k)(j,k)ej&gt; ekej&gt;eke_j > e_kej= ekej=eke_j = e_kej&lt; ekej&lt;eke_j < e_k(l 、l + 1 )(l,l+1)(l,l+1)
14 sorting 

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 …

1
ソートに関する興味深い問題
番号付きのボール(ランダム)が付いたチューブを考えます。チューブにはボールを取り除くための穴があります。1つの操作について次の手順を検討してください。 穴から1つまたは複数のボールを選択し、ボールを選択した順序を覚えておくことができます。 パイプを左側に傾けて、パイプ内の残りのボールが左側に移動し、ボールを取り除いてできた空のスペースを占有する必要があります。 番号の付いたボールをパイプから選んだ順序を変更することは想定されていません。ここで、ボールの動きによって作成された空いているスペースを使用して、再びパイプに戻します。 手順1〜3は1つの操作と見なされます。 番号の付いたボールを昇順に並べ替えるのに必要な最小限の操作を見つけます。 例:チューブに次が含まれる場合:[1 4 2 3 5 6][1 4 2 3 5 6][1\ 4\ 2\ 3\ 5\ 6] 次にととを取り出し、パイプを左に傾けるとを取得し、パイプの最後にをこの順序で挿入して取得します。444555666[1 2 3][1 2 3][1\ 2\ 3](4 5 6)(4 5 6)(4\ 5\ 6)[1 2 3 4 5 6][1 2 3 4 5 6][1\ 2\ 3\ 4\ 5\ 6] …

1
バブルソートでのスワップの予想数
整数の配列が与えられた場合、配列各要素は、ある確率、固定数だけ増加できます。バブルソートを使用して配列をソートするために行われるスワップの予想数を見つける必要があります。NのB P [ I ] 0 ≤ I &lt; NAAANNNbbbp [ i ]p[i]p[i]0 ≤ I &lt; N0≤i&lt;n0 \leq i < n 私は次を試しました: 要素の確率するための与えられた確率から容易に計算することができます。i &lt; jA [ i ] &gt; A [ j ]A[i]&gt;A[j]A[i] > A[j]i &lt; ji&lt;ji < j 上記を使用して、スワップの予想数を次のように計算しました。 double ans = 0.0; for ( int i = 0; …

2
マージソートの「分割」ステップを回避できますか?
したがって、マージソートは、分割統治アルゴリズムです。上記の図を見ながら、基本的にすべての分割ステップをバイパスできるかどうか考えていました。 2つずつジャンプしながら元の配列を反復処理した場合、インデックスiおよびi + 1の要素を取得し、独自のソートされた配列に入れることができます。これらのすべてのサブ配列(図に示すように[7,14]、[3,12]、[9,11]および[2,6])を取得したら、通常のマージルーチンに進んで取得します。ソートされた配列。 配列を繰り返し処理し、必要なサブ配列をすぐに生成するのは、分割ステップを全体で実行するよりも効率が悪いですか?

4
特定のバブルソートアルゴリズムの平均時間の複雑さを評価します。
このバブルソートの疑似コードを考えてみましょう: FOR i := 0 TO arraylength(list) STEP 1 switched := false FOR j := 0 TO arraylength(list)-(i+1) STEP 1 IF list[j] &gt; list[j + 1] THEN switch(list,j,j+1) switched := true ENDIF NEXT IF switched = false THEN break ENDIF NEXT 平均的な時間の複雑さを評価するために覚えておかなければならない基本的なアイデアは何でしょうか?最悪のケースと最良のケースの計算はすでに完了していますが、内部ループの平均的な複雑さを評価して方程式を作成する方法を検討しています。 最悪の場合の方程式は次のとおりです。 ∑i=0n(∑j=0n−(i+1)O(1)+O(1))=O(n22+n2)=O(n2)∑i=0n(∑j=0n−(i+1)O(1)+O(1))=O(n22+n2)=O(n2) \sum_{i=0}^n \left(\sum_{j=0}^{n -(i+1)}O(1) + O(1)\right) = …

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