[英]Getting the largest k elements of a double array
我面臨的問題是這個問題:
我有一個double
s數組,我希望保持前k
更大的值。
Arrays.sort
實現。 例如,在具有相對問題的此示例中 ,建議使用此方法。 k
元素感興趣,所以我也嘗試了MinMaxPriorityQueue
。 我創建了一個MinMaxPriorityQueue
與maximumSize
: 當然還有自動裝箱。
Builder<Comparable> builder = MinMaxPriorityQueue.maximumSize(maximumSize);
MinMaxPriorityQueue<Double> top2 = builder.create();
問題是訂單是升序的,它與我想要的訂單相反。 所以我不能這樣用它。
為了說明問題的真實參數,我的數組長約50
元素,我感興趣的是最高k = 5
元素。
那么有沒有辦法繞過這個問題使用第二種方法? 即使我真的不需要對所有元素進行排序,我應該留在第一個嗎? 你知道速度性能是否有任何顯着差異(我將在很多情況下使用它,以便在需要速度的地方)? 我可以使用其他任何解決方案嗎?
至於性能,我知道理論上我可以自己檢查一下,但是我有點沒時間,如果有人有任何解決方案,我很高興聽到它(或者無論如何都讀它)。
如果您只有50個元素,如我的評論中所述,只需對其進行排序並獲取最后的k
元素。 它僅限2行:
public static double[] largests(double[] arr, int k) {
Arrays.sort(arr);
return Arrays.copyOfRange(arr, arr.length - k, arr.length);
}
這會修改(排序)原始數組。 如果您希望原始陣列未經修改,則只需+1行:
public static double[] largests2(double[] arr, int k) {
arr = Arrays.copyOf(arr, arr.length);
Arrays.sort(arr);
return Arrays.copyOfRange(arr, arr.length - k, arr.length);
}
您可以在已排序的數組上使用System.arraycopy
:
double[] getMaxElements(double[] input, int k) {
double[] temp = Arrays.copyOf(input, input.length);
Arrays.sort(temp); // Sort a copy to keep input as it is since Arrays.sort works in-place.
return Arrays.copyOfRange(temp, temp.length - k, temp.length); // Fetch largest elements
}
對於50個元素,對數組進行排序要比亂用泛型和可比對象快得多。
我會寫一個額外的“快速”算法......
double[] getMaxElements2(double[] input, int k) {
double[] res = new double[k];
for (int i = 0; i < k; i++) res[i] = Double.NEGATIVE_INFINITY; // Make them as small as possible.
for (int j = 0; j < input.length; j++) // Look at every element
if (res[0] < input[j]) { // Keep the current element
res[0] = input[j];
Arrays.sort(res); // Keep the lowest kept element at res[0]
}
return res;
}
這是O(N*k*log(k))
而第一個是O(N*log(N))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.