我一直在通过eloquentjavascript网站学习JavaScript,并且提供了一些我似乎无法理解的代码:
remove: function(node) {
var length = this.content.length;
// To remove a value, we must search through the array to find
// it.
for (var i = 0; i < length; i++) {
if (this.content[i] != node) continue;
// When it is found, the process seen in 'pop' is repeated
// to fill up the hole.
var end = this.content.pop();
// If the element we popped was the one we needed to remove,
// we're done.
if (i == length - 1) break;
// Otherwise, we replace the removed element with the popped
// one, and allow it to float up or sink down as appropriate.
this.content[i] = end;
this.bubbleUp(i);
this.sinkDown(i);
break;
}
},
我的问题是 - 为什么这个功能需要调用bubbleUp()? 如果end是二进制堆上的最后一个值,并且当通过push()方法添加时,推送到堆上的每个值都调用bubbleUp,那么结束值的得分怎么可能低于i的值呢?我是数据结构的新手,似乎无法解决这个问题。
答案 0 :(得分:2)
想象一下这样的小堆:
1
10 2
18 20 3 4
现在,请说删除20
。您拥有的代码基本上将4
置于其位置。
1
10 2
18 4 3
从4&lt; 10,它必须冒泡以满足最小堆的要求。