並べ替えなしで、並べ替えられていないリストでK番目に小さい値を見つける最も速い方法は何ですか?


8

私の初期アルゴリズム:

  1. 要素0を他のすべての要素と比較し、それより少ない要素の数を追跡します。
  2. 正確に(k-1)要素より大きい要素が見つかるまで、各要素について繰り返します。

最悪の場合、これはになると思います。リストをソートせずに実行時間を短縮できますか?O(n2)



2番目のリストを作成して並べ替えることができますか?つまり、k個の最小値のリストを作成できますか?
jmoreno 2017

回答:


10

線形時間の選択アルゴリズムを使用するhttps://en.m.wikipedia.org/wiki/Selection_algorithm


2
特にBlumらによるMedian of Medians、1973は、最悪の場合の線形時間での選択問題を解決します。おそらく私が今まで見た中で最もエレガントなアルゴリズムでしょう。
クイックソート

6
これは質問への回答ですが、リンクだけでなく独自の説明を作成することをお勧めします。

4

残念ながら、コメントすることはできませんが、回答として投稿する必要があります。

とにかく、並べ替えられていない配列で最小ヒープを使用しようとすると、O(n + k * logn)の時間の複雑さを取得できるはずです。


3
残念ながら、コメントすることはできませんが、回答として投稿する必要があります。–投稿のような回答はコメントに含まれないため、これは良いことでした。コメントは質問を改善するためのものであり、短い答えなどではありません。
Wrzlprmft 2017

1
ええと、私は正直に言うと本格的な答えではないように思います。なぜ、または最小ヒープの使用が時間の複雑さを低下させることができるのかについて、具体的なことは何も述べていません。回答よりコメントの方が多い
Luca Giorgi

min-heapとmax-heapのどちらを使用するかは、によって異なります。k

3

Quickselectアルゴリズムは、O(n)の平均的な複雑さでこれを実行できます。これは、Wikipediaによると、最もよく使用される選択アルゴリズムの1つです。

これはQuickSortから派生しているため、悪いピボット(実際には回避できる問題)を使用すると、O(n²)の最悪の場合の複雑さに悩まされます。

一言で言えば、アルゴリズム:QuickSortのようにピボットした後は、配列の下部または上部のどちらかに降下します-どちらが後の要素を持っているかに応じて。


2

kk

  1. k
  2. i
    • M
    • i<MMi

k

O(k)O(n.logk)


1
最大ヒープまたは最小ヒープ。k> n / 2に依存します。

@Evil iがヒープ内のどの要素よりも小さいかどうかを確認したい。したがって、それらが最大のものよりも小さいかどうかを知りたいのです。最大要素の検索は、max-heapではO(1)ですが、min-heapではありません。
Behrouz Babaki 2017

1
そうだね。k = 1またはk = nを想像してください。両方のケースで同じヒープを使用しますか?たぶん、それがより高速であるときに、min-heapを何らかの方法で使用することは可能ですか?(私はそれを知っています、あなたは私から+1を持っています、ただのつまらないものです、心配しないでください)。

1
@悪あなたは正しいです。急いでコメントを破棄しました。k> n / 2の場合、同様の方法を使用して(nk)個の最大要素を最小ヒープに格納できます。ヒープから削除された要素は、私たちが望むものです。
Behrouz Babaki 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.