大顶堆和小顶堆构造,如何构建大顶堆

基础数据结构

想象一下有一个数组。 数组有0到9、10个元素。

我们按顺序画二叉树。

在数组中输入数据时,也会输入树种对应节点的值。 在这里,我们观察到树内的节点之间有以下关系。

将当前节点的下标设为i ——

的左子节点的下标为2 * i 1;

的右子节点的下标为2 * i 2;

大山和小山

大顶推满足的条件是每一个父节点都比子节点大。

那么,该如何通过调换节点的位置来构建这样的数据结构呢?

取这棵树的碎片,假设数据是2,1,3。 那么,heapify-down必须通过交换2、1和3中相对较大的节点来满足条件。

这是我们调整的过程。

观察表明,对于长10的树(堆),自顶向下分别对节点4、3、2、1、0进行heapify,可以满足大顶堆的满足条件。

创建堆代码:

//buildmaxheappublicvoidbuildheap (int [ ] arr ) ) for ) intI=arr.length/2; i=0; I—-{adjust(ARR,I ); }但是,这里有需要注意的地方。 例如,如果对节点1执行heapify,则节点1将与节点3和节点4中值较大的节点交换值。 这样,节点3或4的值将发生变化,您必须再次对已重排的节点执行heapify,以满足堆条件。 因此,heapify中存在递归。

对于大的天花板山,我们从下到上封山,将最大值推至0的位置。

请注意,我们的heapify会自顶向下移动较大的元素。

publicvoidadjust(int[]arr,int i ) { int maxIndex=i; int len=arr.length; if (2* i1 lenarr [2* i1 ] arr [ maxindex ] ) maxIndex=2*i 1; if (2* I2 lenarr [2* I2 ] arr [ maxindex ] ) maxIndex=2*i 2; 最大索引!=i ) swap(arr,maxIndex,I ); adjust(ARR,maxIndex ); }添加新元素。

如果将新元素添加到堆中,则需要重试heapify操作。 只需将元素添加到堆的末尾,然后重试heapify即可。

在应用中,往往需要找到第k大的数字。 在建造大的天花板堆后,您只需确定新元素是否小于天花板元素,如果小于,则需要将其替换,然后重新启动heapify-down。

此外,还有自下而上的调整操作heapify-up,这些可以根据需要自己构建。

在java中我们可以使用PriorityQueue来解决涉及堆的问题。

一分快三单双大小死规律1 lenarr [2* i1 ] arr [ maxindex ] ) maxIndex=2*i 1; if (2* I2 lenarr [2* I2 ] arr [ maxindex ] ) maxIndex=2*i 2; 最大索引!=i ) swap(arr,maxIndex,I ); adjust(ARR,maxIndex ); }添加新元素。

如果将新元素添加到堆中,则需要重试heapify操作。 只需将元素添加到堆的末尾,然后重试heapify即可。

在应用中,往往需要找到第k大的数字。 在建造大的天花板堆后,您只需确定新元素是否小于天花板元素,如果小于,则需要将其替换,然后重新启动heapify-down。

此外,还有自下而上的调整操作heapify-up,这些可以根据需要自己构建。

在java中我们可以使用PriorityQueue来解决涉及堆的问题。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平