基础数据结构
想象一下有一个数组。 数组有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来解决涉及堆的问题。