簡體   English   中英

數組復雜度中的K個最大元素

[英]K largest elements in an array complexity

我正在使用最大堆來查找數組中的k個最大元素,如下所示:

1)我已經建立了給定數組的前k個元素(arr [0]至arr [k-1])的最小堆MH。 好)

2)對於每個元素,在第k個元素(arr [k]至arr [n-1])之后,將其與MH的根進行比較。

……a)如果元素大於根,則將其設為根並為MH調用heapify

……b)否則忽略它。

//步驟2為O((nk))

3)最后,MH具有k個最大元素,MH的根是第k個最大元素。

我已經在網上搜索了,第二步的復雜度顯示了O(nk)logk,如果我們使用自下而上的方法來構建堆,我認為應該是(nk)* O(k)。只要找到更大的元素,就替換根。 而堆放k個元素的數組的復雜度為O(k)

我錯了嗎? 我只需要知道我是否認為正確?

我的方法如下:

private static void createMinHeap(int[] arr) {

        for (int i = arr.length / 2; i >= 0; i--) {
            restoreDown(arr, i);
        }

    }

    private static void restoreDown(int[] arr, int i) {

        int left = (2 * i) + 1;
        int right = (2 * i) + 2;
        int num = arr[i];

        while (right <= arr.length) {

            if (num <= arr[right] && num <= arr[left]) {
                arr[i] = num;
                return;
            } else if (arr[right] < arr[left]) {
                arr[i] = arr[right];
                i = right;
            } else {
                arr[i] = arr[left];
                i = left;
            }

            left = (2 * i) + 1;
            right = (2 * i) + 2;
        }

        if (left == arr.length - 1 && arr[left] < num) {
            arr[i] = arr[left];
            i = left;
        }

        arr[i] = num;

    }

您的推論幾乎是正確的,但是對於大小為k的堆,heapify操作需要O(log k) 因此,總復雜度為O(n log k) 為什么? 在最壞的情況下,您應該為剩余的nk元素中的每個元素執行heapify。 由於k是固定的,並且n可以任意大,即O(n)步,最終得到O(n log k)

也可以看看:

選擇算法使您可以在O(n)時間中找到數組中的第k個元素或最大k個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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