C#:N x N行列で最大のm個の要素を見つけるための効率的なアルゴリズム

StackOverflow https://stackoverflow.com/questions/814186

  •  03-07-2019
  •  | 
  •  

質問

次のようなメソッドヘッダーを使用して、N x N行列で最大のm個の要素を見つけるための効率的なアルゴリズムがあるかどうかを知りたい:

double[] greatestValues(double[][] matrix, int numberOfElements);

アイデアはありますか

役に立ちましたか?

解決

N x N行列をN x Nアイテムの配列として扱う場合、次の手法のいずれかを適用できます。

  

クイックソートベースの選択アルゴリズムの直接適用   ソートベースの選択アルゴリズムは   k個の最小またはk個の最大を見つけるために使用   要素。 k個の最小要素を見つけるには   を使用してk番目に小さい要素を見つける   中央値クイックソートベースの中央値   アルゴリズム。パーティションの後   k番目に小さい要素、すべてを見つける   k番目より小さい要素   小さい要素が左に存在します   k番目の要素とすべての要素   より大きく   k番目に小さい要素。したがって、すべて   1番目からk番目の要素   包括的k最小   要素。時間の複雑さは   nの線形、の総数   要素。

     

データ構造ベースのソリューション別の簡単な方法は、それぞれを追加することです   リストの要素を順序付けする   ヒープなどのデータ構造を設定する、または   自己バランス型バイナリ検索ツリー、   最大k個の要素を持つ。いつでも   データ構造にkより大きい   要素、最大の   O(log k)で実行できる要素   時間。各挿入操作も   O(log k)時間かかり、結果として   全体のO(nlog k)時間。

     

リストを変換することは可能です   Θ(n)時間でヒープに入れてから、   変更されたを使用してヒープを走査する   幅優先の検索アルゴリズム   要素を優先度に配置します   キュー(通常のキューの代わりに   通常BFSで使用されます)、および   走査後にスキャンを終了します   正確にk個の要素。キューサイズとして   トラバーサル全体を通してO(k)のままで、   O(klog k)時間を必要とします   完了し、   このアルゴリズムのO(n + klog k)。

こちらから。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top