实现一个函数,它将
i
中的元素替换为k
,在最小堆中重新排列堆。
这是我的解决方案,请告诉我是否正确。
解决方案1:
1)堆[I] = K
2)heapify(heap,1)
但在这种情况下这似乎是错误的:
10
/ \
14 59 (<-was 12 before replacing)
.. / \
55 20
所以这里我们交换(55,59)但仍然是min-heap属性将被消除。
解决方案2:
1)用堆[last index]替换heap [i] 2)heapify(堆,1)
3)现在在堆中插入通常的程序
时间复杂度 - O(log N)
是(解决方案2 )正确的做法?如果没有,请提供一些hints
。
答案 0 :(得分:4)
像解决方案1这样的东西可能更好。
heap[i] = k
heap[i]
小于其父级,请将其冒泡(游泳)heap[i]
大于其中一个孩子,请将其冒泡(下沉)运行时间:O(log n)
。
游泳 - 虽然它比它的父母小,但是把它与父母交换。
沉没 - 虽然它比一个孩子大,但要与最小的孩子交换。
sink
和swim
的一些Java代码,取自here:
private void swim(int k) {
while (k > 1 && less(k/2, k)) {
exch(k, k/2);
k = k/2;
}
}
private void sink(int k) {
while (2*k <= N) {
int j = 2*k;
if (j < N && less(j, j+1)) j++;
if (!less(k, j)) break;
exch(k, j);
k = j;
}
}
答案 1 :(得分:1)
以下是在O(logn)
以下操作的伪代码: -
void replaceHeap(int index,int value) {
heap[index] = value;
BubbleUp(index);
Heapify(index);
}
void BubbleUp(int index) {
parent = index/2;
while(index>1&&heap[parent]>heap[index]) {
swapElementAt(parent,index);
index = parent;
parent = index/2;
}
}
Heapify is standard as you have done it
答案 2 :(得分:0)
为简单起见,这是python中最简单的实现。
# Replace item
self.heap[index] = something_new
# Get left child
try:
left_child = self.heap[2 * index + 1]
except IndexError:
left_child = None
# Get right child
try:
right_child = self.heap[2 * index + 2]
except IndexError:
right_child = None
# Get parent
parent = self.heap[int(math.floor(index / 2))]
# If smaller than parent, swim up
if parent is not None and self.heap[index] < parent:
swim(index)
break
# If larger than one of its children sink
if left_child is not None:
if self.heap[index] > left_child:
sink(index)
break
if right_child is not None:
if self.heap[index] > right_child:
sink(index)
break
答案 3 :(得分:-2)
如果它小于它的父亲DecreaseKey(k),否则做MinHeapify(k)