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 を使用する方法を理解していますか?