k
入力配列から最上位の要素を返す効率的な方法を探しています。1 つの方法は、配列をソートし、配列の末尾から要素
を返すことです。k
hereで提案されている他の方法があり、そのうちの 1 つはquickselect アルゴリズムを使用しますが、私の理解では、quickselect はk
ソートされていない配列の 番目の要素のみを返します。戻った後、左右の要素k
はまだソートされていません。
したがって、次のようになります。
while k>0{
quickselect(int[] arr, k);
k--;
}
クイック選択はO(n)
であり、それを2k
回行うので、全体的な時間の複雑さはO(n*k)
です。
しかし、投稿のデータは、これが よりも優れていることを示唆していますO(n log n)
。
100 万のサンプルから上位 200 を選択すること200 million
は、前者の場合を意味しますが20 million
、後者の場合を意味します。明らかに、これははるかに優れています。
上位 200 個の要素を選択するために quickselect を使用する方法を理解していますか?