簡體   English   中英

獲取雙數組的最大k元素

[英]Getting the largest k elements of a double array

我面臨的問題是這個問題:

我有一個double s數組,我希望保持前k更大的值。

  1. 我見過一些涉及Arrays.sort實現。 例如,在具有相對問題的此示例中 ,建議使用此方法。
  2. 由於我只對前k元素感興趣,所以我也嘗試了MinMaxPriorityQueue 我創建了一個MinMaxPriorityQueuemaximumSize

當然還有自動裝箱。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM