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

並べ替えアルゴリズムとその速度と複雑さについての質問。


6
「究極のシャッフル」アルゴリズムを作成して、mp3コレクションを並べ替えたい
私は、タイトルとアーティストの重複を避ける方法でmp3ファイルをソートするための擬似コードの提案を探しています。私はクルーナーに耳を傾けます-フランク・シナトラ、トニー・ベネット、エラ・フィッツジェラルドなど、古い基準を歌います。各アーティストは、同じ曲を多数録音します-フライミートゥザムーン、ザウェイユールックトゥナイト、スターダストなど。2000曲あり、20曲がEllaのものである場合、100曲ごとに1回だけ聞きたいです。10人のアーティストがFly Me To The Moonを歌うなら、200曲に1回聴きたいです。もちろん、これら2つの要件を組み合わせて、「究極のシャッフル」を作成します。 これはかなり広範にわたる未解決の質問です。まだプログラミングを始めていませんので、良いアプローチの提案を探しています。実際には、他の曲の属性を均等に配置することに関して他のいくつかの要件がありますが、ここではそれに入りません。 出発点として、ここで見つけたコードを変更して、mp3ファイルを操作し、ID3タグを読み取ります。 以下のparsifalの回答を使用して、私のニーズを満たす小さなアプリを作成しました。ここにフォローアップの質問も書きました。素晴らしい反応をありがとう!


4
一部の並べ替え方法が1、10、2、3…で並べ替えられるのはなぜですか?
多くの数値ソート方法が、予想される1、2、3、10ではなく、1、10、2、3 ...でソートされるように見えることに気づきました。最初の方法が必要であり、ユーザーとして、実際にそれを見るたびにイライラします。最初のスタイルと2番目のスタイルの合法的な使用例はありますか?もしそうなら、彼らは何ですか?そうでない場合、最初のソートスタイルはどのようにして生まれましたか?各ソート方法の正式名称は何ですか?
30 sorting 

14
あなたが知っている最もあいまいなソートアルゴリズムは何ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 私はちょうど読んcyclesort sortvis.orgブログ記事を経由して。これはおそらく、私がよく知らない数学を使用しているため、これまで聞いた中で最もあいまいなものです(整数セットの順列でサイクルを検出)。 あなたが知っている最も不明瞭なものは何ですか?

3
順序付けされた情報をリレーショナルデータベースに保存する方法
注文した情報をリレーショナルデータベースに適切に保存する方法を理解しようとしています。 例: 曲で構成されるプレイリストがあるとします。リレーショナルデータベース内には、Playlistsいくつかのメタデータ(名前、作成者など)を含むの。また、私はと呼ばれるテーブルを持っSongs含む、playlist_id曲固有の情報(名前、アーティスト、期間など)だけでなく、。 デフォルトでは、新しい曲がプレイリストに追加されると、最後に追加されます。Song-ID(昇順)で注文する場合、注文は追加の順序になります。しかし、ユーザーがプレイリストの曲を並べ替えることができるとしたらどうでしょうか? いくつかのアイデアを思いつきました。それぞれに長所と短所があります。 と呼ばれる列orderは、。整数です。曲を移動すると、その変更を反映するために、古い位置と新しい位置の間のすべての曲の順序が変更されます。これの欠点は、曲を移動するたびに多くのクエリを実行する必要があり、移動アルゴリズムが他のオプションほど簡単ではないことです。 orderという10進数の列(NUMERIC)。曲を移動すると、隣接する2つの数字の間に浮動小数点値が割り当てられます。欠点:10進数フィールドはより多くのスペースを必要とし、数回変更するたびに範囲を再分散するように注意しない限り、精度が不足する可能性があります。 別の方法はprevious、next他の曲を参照するフィールドとフィールドを持つことです。(または、現在、プレイリストの最初の曲、最後の曲の場合はNULLです。基本的には、リンクリストを作成します)。欠点:「リストでX番目の曲を見つける」などのクエリは、一定時間ではなく、線形時間になります。 これらの手順のうち、実際に最もよく使用されるのはどれですか?これらの手順のうち、中規模から大規模のデータベースで最も速いのはどれですか?これを実現する他の方法はありますか? 編集:簡単にするため、この例では、ソングは1つのプレイリストにのみ属します(多対1の関係)。もちろん、ジャンクションテーブルを使用して、song⟷playlistを多対多の関係にすることもできます(そして、そのテーブルに上記の戦略の1つを適用します)。

8
ソートされたデータを必要とするバイナリ検索が線形検索よりも優れていると考えられるのはなぜですか?
線形検索は単純なアプローチであり、漸近的な複雑さのために、バイナリ検索はパフォーマンスよりも優れているといつも聞いています。しかし、バイナリ検索の前に並べ替えが必要な場合、線形検索よりも優れている理由を理解できませんでしたか? 線形検索はでO(n)あり、バイナリ検索はO(log n)です。これが、バイナリ検索の方が優れていると言う根拠のようです。ただし、バイナリ検索ではO(n log n)、最適なアルゴリズムのためのソートが必要です。したがって、ソートが必要なため、バイナリ検索は実際には高速になりません。 著者は、単純な線形検索アプローチを使用するよりも挿入ソートで、アイテムを挿入する必要がある場所を見つけるためにバイナリ検索を使用する方が良いと示唆するCLRSを読んでいます。この場合、各ループ反復で、バイナリ検索を適用できるソート済みリストがあるため、これは正当化されているようです。しかし、検索が必要なデータセットについての保証がない一般的なケースでは、ソート要件のために実際にバイナリ検索を使用していないのは線形検索よりも悪いですか? 私が見落としている実用的な考慮事項はありますか?または、ソートに必要な計算時間を考慮せずに、バイナリ検索は線形検索よりも優れていると見なされますか?

3
Javaおよび.NET:異なるソートアルゴリズムがデフォルトで使用される理由
デフォルトで異なるソートアルゴリズムJavaを.NET Framework使用する理由と疑問に思います。 Java Array.Sort()では、デフォルトでMerge Sortアルゴリズムを使用し、Wikipedia.comが次のように述べています。 Javaでは、Arrays.sort()メソッドは、データ型に応じてマージソートまたは調整されたクイックソートを使用し、実装効率のために7つ未満の配列要素がソートされている場合は挿入ソートに切り替えます .NET Framework Array.Sort/List.Sort()では、クイックソートをデフォルトのソートアルゴリズムとして使用します(MSDN): List.Sort()は、QuickSortアルゴリズムを使用するArray.Sortを使用します。この実装は、不安定なソートを実行します。つまり、2つの要素が等しい場合、それらの順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。 優れた「アルゴリズムの比較」表を見ると、両方のアルゴリズムの動作がワーストケースとメモリ使用量の観点からかなり異なっていることがわかります。 どちらJavaと.NETエンタープライズ・ソリューション開発のための素晴らしいフレームワークです、両方が組込み開発のためのプラットフォームを持っています。では、なぜ彼らはデフォルトで異なるソートアルゴリズムを使用しているのでしょうか?

5
アルゴリズムリフレッシャー。ヒープソートが分類アルゴリズムであるのはなぜですか?
ヒープソートがインプレースソートアルゴリズムと見なされる理由がわかりません。 つまり、並べ替えられる配列の要素(つまりヒープ)が追加された追加のデータ構造を使用して、最小値の抽出と並べ替えプロセスを支援します。 ここでインプレースの定義を誤解しているのではないでしょうか? しかし、たとえば挿入ソートは、インプレースアルゴリズムである、つまり要素に余分なメモリが必要ないことは明らかです。 それで、なぜそれはインプレースと見なされますか?

2
2N lnNを理解しようとすると、クイックソートが比較されます
SedgewickのAlgorithmsブックでクイックソートの分析を行っていました。彼は、N個の異なる項目の配列をソートしながら、クイックソートで比較の数について次の繰り返し関係を作成します。 私はこれを理解するのに苦労しています...任意の要素がピボットになるには1 / Nの確率がかかり、kがピボットになると、左のサブアレイにはk-1個の要素があり、右のサブアレイには配列にはNk個の要素が含まれます。 1.パーティション分割のコストはどのようにN + 1になりますか?パーティション分割を行うのにN + 1回比較しますか? 2.Sedgewickは、kの各値について、それらを合計すると、分割要素がkである確率+上記の式を得る2つのサブアレイのコストを言います。 数学の知識が少ない人(私)が理解できるように、誰かがこれを説明できますか? 具体的には、方程式の2番目の項をどのように取得しますか? その用語の正確な意味は何ですか?


7
大量のデータで機能するソートアルゴリズム
大量のデータを処理できる、つまり、データセット全体を一度にメインメモリに保持できない場合でも動作できるソートアルゴリズムを探しています。 私が今まで見つけた唯一の候補はマージソートです。メインメモリにすべてのデータを一度に保持することなく、各マージでデータセットをスキャンするようにアルゴリズムを実装できます。私が念頭に置いているマージソートのバリエーションについては、この記事の「テープドライブで使用する」セクションで説明しています。 私はこれが良い解決策だと思います(複雑さO(nx log(n)))が、メインメモリに収まらない大きなデータセットで動作できる他の(おそらくより高速な)ソートアルゴリズムがあるかどうか知りたいです。 編集 回答に必要な詳細を次に示します。 データは定期的に、たとえば月に1回ソートする必要があります。いくつかのレコードを挿入する必要はなく、データをインクリメンタルにソートする必要があります。 私のサンプルテキストファイルは約1 GBのUTF-8テキストですが、たとえば20 GBのファイルであっても、一般的な問題を解決したかったのです。 データベースにはありません。また、他の制約のため、そうすることはできません。 データは他の人によってテキストファイルとしてダンプされます。このテキストファイルを読み取るための独自のコードがあります。 データの形式はテキストファイルです。改行文字はレコード区切り文字です。 私が考えていた改善の1つは、ファイルをメモリ内でソートできるほど小さいファイルに分割し、最後に上記のアルゴリズムを使用してこれらすべてのファイルをマージすることでした。

2
IComparableインターフェースは時代遅れ/「有害」ですか?
IComparable 一方向にしか機能しない Employeeクラスがあるとしましょう。1つのビューでは、すべてEmployeesを名前でソートし、別のビューではアドレスでソートして表示します。どうやってそれを達成するつもりですか?ではなくIComparable、少なくとも慣用的な方法ではありません。 IComparable ロジックが間違った場所にある を呼び出すことにより、インターフェースが使用され.Sort()ます。Customer名前で並べ替えられたビューでは、並べ替え方法を示すコードはまったくありません。 一方、Customerクラスは、どのように使用されるかを想定しています-この場合、名前でソートされたリストで使用されることを想定しています。 IComparable 暗黙的に使用されます 代替と比較して、比較ロジックがどこで使用されているか、またはまったく使用されているかどうかを確認することは非常に困難です。標準IDEを想定し、Customerクラスから始めて、 へのすべての参照を検索 Customer リストで使用されている参照を見つける それらのリストが.Sort()それらを呼び出したことがあるかどうかを確認します さらに悪いことに、IComparableまだ使用されている実装を削除しても、エラーや警告は表示されません。あなたが得る唯一のものはあなたが考えるにはあまりにもあいまいだったすべての場所で間違った行動です。 これらの問題が組み合わさり、要件が変わります 私がこれについて考えるようになったまさにその理由は、それが私にとって間違っていたからです。私はIComparable2年前からアプリケーションで喜んで使用しています。ここで、要件が変更され、物を2つの異なる方法でソートする必要があります。前のセクションで説明した手順を実行するのは面白くないことに気づきました。 質問 これらの問題により、代替手段ではうまく機能しない有効なユースケースが見られないという点で、またはにIComparable劣ると考えるようになります。LINQまたはLINQ を使用する方が常に良いのですか、それとも、ここで見られない利点/ユースケースがありますか?IComparer.OrderBy() IComparer
11 c#  sorting  comparison 

2
クイックソートの悪い例は何ですか?
私はクイックソートについて学習しており、クイックソートが困難なさまざまな配列を例示したいと思います。私が念頭に置いているクイックソートには、初期ランダムシャッフルはなく、2つのパーティションがあり、中央値を計算しません。 これまでに3つの例を考えました。 [1,2,3,4,5,6,7,8,9,10] - when the array is sorted [10,9,8,7,6,5,4,3,2,1] - when the array is reversed [1,1,1,1,1,1,1,1,1,1] - when the array is the same values [1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys たとえば、これについてはよくわかりません。 [1,3,5,7,9,10,8,6,4,2] では、クイックソートが(ほぼ)理想的である配列と比較して困難な配列は何でしょうか?

4
ドラッグ&ドロップUIでリストアイテムの並べ替え順序を管理する最良の方法は何ですか?
表形式でWebページに表示する必要がある生徒のリストがあります。 アイテムは、SortOrder情報とともにDBに格納されます。 この投稿のように、ユーザーはWebページで、アイテムを希望の並べ替え順序にドラッグアンドドロップして、リストの順序を並べ替えることができます。 以下は、私のテストページのスクリーンショットです。 上記の例では、各行に並べ替え順序情報が添付されています。John Doe(学生ID 10)を学生ID 1の行の上にドロップすると、リストの順序は2、10、1、8、11になります。 ソート順情報を保存および更新するための楽観的な(リソースを節約する)方法は何ですか? 私の現時点での唯一のアイデアは、リストの並べ替え順序が変更されるたびに、すべてのオブジェクトのSortOrder値を更新する必要があるということです。 参考までに:テーブルに最大25行ある可能性があります。
10 c#  sorting 

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