堆的定义



最大(最小)堆是每个节点的树,其键值不小于(子)的键值(如果存在),大顶是一棵完整的两棵树,也是最大的树,小顶是一棵完全二叉树,也是最小的树。

另外,记住这两个概念,编写代码太重要了。

1,父节点和子节点之间的关系:查看定义



2,完整的两叉树:引用{ 2 }



基本操作



1,构建(构建堆)



2,插入(插入)



3,删除(删除:最小的或最大的)



代码实现



首先,在编写代码之前有两个非常重要的问题:

1。数组可以用作堆的存储结构。它非常简单,易于操作。



2。另外,由于它是作为存储结构的数组,所以可以根据索引方便地找到父节点和子节点之间的关系。



对于以0作为数组索引开始的Javascript,以下是:


nleftindex = 2 *(nfatherindex + 1)- 1;
nrightindex = 2 *(nfatherindex + 1);


先前对这两个概念的注意有助于理解:

1,因为它是一个数组,所以父和子之间的关系不需要特殊的结构来维护,可以得到索引之间的计算,这就省去了很多麻烦,如果是链式结构,就要复杂得多。



2、完成二叉树可以参考{ 2 }要求,填补叶节点从左到右,为了填补下一层,这就保证了不需要一系列大型移动。这也是一个短板的随机存储结构(数组):删除一个元素后,整体推进是time-consuming.this特征也使得堆到树的根节点的根加上一个叶节点的元素被删除时。



代码实现:


/ ******************************************************
*文件:堆
*作者:页
*时间:2016 11 02
******************************************************* /
函数堆()
{
this.data = { };
}

(heap.prototype.print =功能){
console.log(堆+这个数据);
}

heap.prototype.build =功能(数据){
初始化
this.data = { };
如果(!数据是数组)
返回false;

堆
对于(var i = 0;i < data.length;+ +我){
This.insert(数据{我});
}

返回true;
}

heap.prototype.insert =函数(值){
如果(!this.data instanceof Array){
this.data = { };
}

This.data.push(值);
更新新节点
VaR nIndex = this.data.length-1;
无功nfatherindex = math.floor((nindex-1) / 2);
而(nfatherindex > 0){
如果(这个数据{ } <此数据索引。nfatherindex { }){
VaR温度=这数据{ nIndex };
这个数据{ } = {这个索引数据nfatherindex };
这一数据nfatherindex } = {温度;
}

nIndex = nfatherindex;
nfatherindex = math.floor((nindex-1) / 2);
}
}

heap.prototype.delete =函数(){
如果(!this.data instanceof Array){
返回null;
}

VaR nIndex = 0;
VaR值=该数据{ nIndex };
无功nmaxindex = this.data.length-1;
更新新节点
var NLEAF = this.data.pop();
这一数据{ } = NLEAF索引;

而(nIndex < nmaxindex){
无功nleftindex = 2 *(nIndex + 1)- 1;
无功nrightindex = 2 *(nIndex + 1);

找到 / /一个孩子节点的最小(nleftindex < nrightindex)
无功nselectindex = nleftindex;
如果(nrightindex < nmaxindex){
nselectindex =(这个数据nleftindex } { } { >这个数据nrightindex)nrightindex:nleftindex;
}

如果(nselectindex这个数据{ nselectindex }){
VaR温度=这数据{ nIndex };
这个数据{ } = {这个索引数据nselectindex };
这一数据nselectindex } = {温度;
}

nIndex = nselectindex;
}

返回值;
}
测试
var堆=新堆();
heap.build({ 1, 3, 5,11, 4, 6,7, 12, 15,10, 9, 8 });
heap.print();
插入
Heap.insert(2);
heap.print();
删除
Heap.delete();
heap.print();


关于Javascript的几点



这是一种面向对象的方法,感觉不太优雅,不知道没有更好的表示和写作。



学习数组的一些用法:推和弹出操作非常好。



判断数组的方式也从网上临时搜索(实例)。这并不令人印象深刻。如果你不使用它,它很有可能在下次被忘记。

参考资源



{ 1 }数据结构和算法分析:C语言描述

{ 2 }图数据结构(8)--二叉堆

{ 3 } >数据结构:堆

总结

Javascript数组实现推送和弹出操作。许多其他语言也提供类似的数据结构和操作,如C++的向量,并支持随机操作。所以,我开始想,如果这些结构简单的结合自动分拣的概念,一堆会容易解决。后来,我们可以看到,C++ STL make_heap知道她知道的太少,但我很高兴,我的想法是right.javascript没有检查,我认为这是容易发生或实现;

在你完成它之后,我们发现结构非常简单,只要你愿意靠近它一次。

Javascript的细节仍然不太清楚,例如,数组的应用程序将再次被使用,Javascript的灵魂仍然未被触及。它的本质需要不断地学习和实践。



这些代码,只要你理解概念,了解编程的基础,你可以写出来。不过,也可以将代码更简洁,例如写,当删除功能要求的最小的子节点的左、右节点不需要比较的指标,它必须是小的左边部分的代码觉得它可以继续优化和精简。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,您可以留言交流,谢谢您的支持。