我使用的最大堆找到对数组中的k个最大的元件如下:k个最大元素
1)I具有建立的前k个元素的最小堆MH(ARR [0 ]到arr [k-1])给定数组。 (k)
2)对于每个元素,在第k个元素(arr [k]到arr [n-1])之后,将其与MH的根进行比较。
...... a)如果元素比根更大然后使它根和呼叫heapify为MH
...... b)中否则忽略它。
//步骤2是O((N-K))
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;
}
再平衡是登录N,不为N. – stark
你可能会考虑要求在CS或CS理论或算法。 SO更多的是程序代码。 – Elyasin
堆积一个k元素数组的复杂性是O(log(k))我认为。在最糟糕的情况下,您只会为每个节点从顶端开始堆砌一棵子树,不是吗? –