在许多关于二进制堆的讨论中,通常仅将减小键列为最小堆的受支持操作。例如,CLR第6.1章和此Wikipedia页面。为什么通常不会为最小堆列出增加密钥?我想可以通过将增加的元素(x)迭代替换为其最小的子元素来在O(height)中做到这一点,直到其子元素都不大于x为止。
例如
IncreaseKey(int pos, int newValue)
{
heap[pos] = newValue;
while(left(pos) < heap.Length)
{
int smallest = left(pos);
if(heap[right(pos)] < heap[left(pos)])
smallest = right(pos);
if(heap[pos] < heap[smallest])
{
swap(smallest, pos);
pos= smallest;
}
else return;
}
}
以上正确吗?如果没有,为什么?如果是,为什么没有列出最小堆的增加密钥?