2012-03-31 13 views
-3

可能性の重複:私はサイズの未ソート配列に出力する10日、最高数をアルゴリズムを書くにはどうすればよい
How to find the kth largest element in an unsorted array of length n in O(n)?出力ソートされていない配列の10番目の最大数

n(Java版)?

することができますが O(n)

で、アレイ内のk番目の最大/最小の数はまた、部分ソートを使用して行われ、または固定サイズkの分、ヒープを使用することができ見つかっselection algorithm、探している

+7

質問はすでに.. [リンク] http://stackoverflow.com/questions/251781/how-to-find-theに答えてきました-kth-largest-in-an-sort-length-n-in-onの長さ 質問をする前に一度検索してください:-) – Aravindh

+0

私は何も持っていません。 – user1305400

答えて

2

これは毎回k番目に高い数値を含み、このヒープを維持しながら配列を反復処理します。

任意のkの一般的な問題に対して、最後の解[min-heap]は、大きなO表記の観点から選択アルゴリズムが効率が悪いことに注意してください。

+2

確かに、もしそれが常に10番目の大きさであれば、これは大量に問題を過剰にしているかもしれません。 :-) – templatetypedef

+0

ええ、選択アルゴリズムのどのアルゴリズムを使うべきですか – user1305400

+0

@user:あなたが好きなところ。また、ハードコーディングされた項目数に対して 'O(n)'ではなく 'O(n * log n)'となる最高10個の数値をソートして抽出することもできます。 –

2

10個の要素の配列を作成します。配列の要素をソートしたままにしておきます。

元の配列を1回通すと、配列10の中の最小のものと比較されます。大きい場合はそれを入れます。それ以外の場合は移動します。

+0

この配列を維持するには、挿入する各要素ごとに 'k'操作が必要であることに注意してください。 'k == 10 'のヒープが良いか悪いのか分かりませんが、' k'の値が大きければ問題になるでしょう。 – amit

+0

実際には、平均でk/2 opsが必要です。 –

+0

そして、k = 10の場合、配列をヒープとして構造化する価値はありません。 Log 2 of 10は3から4の間ですが、操作のコストが高くなります。 – DRVic

0

Prune and Searchアルゴリズムには、配列に個別の要素が含まれていない場合(たとえばダブルスを含む)、アルゴリズムを使用することをお勧めします。であるが、個別の要素が含まれている場合(整数) - Counting sortを使用し、10番目の要素を選択)

関連する問題