3

クラスがあります

public class Entity : IComparable<Entity>
{

    public float Priority { get; set; }

{

リストを作成し、順不同の Y 個の項目を入力します

list <Entity> = get_unorderd_list();

今、私は Priority 値に従ってリストをソートしたいのですが、パフォーマンス上の理由から、X がたくさんあるため、通常の .sort() メソッドを使用したくありません。 Yより小さい。

カスタムの並べ替えメソッドを作成する必要がありますか? または、これを行う方法はありますか?

編集: .max() を使用して単一の velue を取得することについては話していません

4

3 に答える 3

3

カスタムの並べ替えメソッドを作成する必要がありますか?

.NET自体から簡単に行う方法がわかりません。Edulinq にソートを実装したとき、私はこの種のアプローチを採用しました。順序付け全体はクイックソートですが、これまでのところ、結果を返すために必要な分だけソートしています。

さて、これはまだ一般的なアプローチです。必要な結果の数を事前に知っていれば、おそらくもっとうまくいくでしょう。制限されたヒープ (最大サイズ X) を持つヒープベースのソリューションを構築し、入力を反復処理して、ヒープに値を追加することをお勧めします。最初の X 要素がいっぱいになるとすぐに、ツリーの残りの部分を見なくても、最小のヒープ要素よりも小さい新しい要素を破棄し始めることができます。他の要素については、通常の操作を実行して要素を挿入し、ヒープ内の順序を維持します。

ヒープを構築する方法の詳細については、配列として格納されたバイナリ ヒープに関するウィキペディアの記事を参照してください。

于 2012-11-26T07:03:02.957 に答える
1

MAX を意味する場合は、単純に linq Max を使用して最も優先度の高い項目を見つけます。Max よりも効率的なメソッドを作成することはできません。とにかく、リスト内のすべての項目を比較して max を見つける必要があるためです。

var highestPeriorityItem = unorderd_list.Max(x=>x.Periority);

編集:

これよりも効率的な別の方法があります。つまり、リストを最初から並べ替えたままにしておくことです。つまり、各挿入で並べ替えたリストを保持する必要があります (並べ替えられた順序でアイテムを挿入します)。このように、最大​​アイテムを見つける時間の複雑さはO(1)であり、新しいアイテムを挿入する時間の複雑さは ですO(1) < x < O(N)

お役に立てれば。

于 2012-11-26T06:55:09.260 に答える
1

問題は、ソートされていないリストの最後のアイテムが X の最高のアイテムになる可能性があるため、Y 全体を反復処理する必要があることです。

于 2012-11-26T06:57:34.303 に答える