[英]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.