二进制堆 - 为什么删除函数需要调用bubbleUp方法?

时间:2014-02-28 20:21:24

标签: javascript binary heap push

我一直在通过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的值呢?我是数据结构的新手,似乎无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

想象一下这样的小堆:

       1
   10      2
 18  20  3   4

现在,请说删除20。您拥有的代码基本上将4置于其位置。

       1
   10      2
 18   4  3

从4&lt; 10,它必须冒泡以满足最小堆的要求。