当前位置: 首页 > 后端技术 > Java

数据结构之堆:初学者一篇文章

时间:2023-04-02 09:16:24 Java

类别:特征名词定义实用课文:1.定义:堆(heap)是计算机科学中一种特殊类型数据结构的总称。堆通常是一组对象,可以被认为是一棵树。n个元素的序列{k1,k2,ki,...,kn}被称为堆当且仅当它满足以下关系。(ki<=k2iandki<=k2i+1)or(ki>=k2iandki>=k2i+1)分析:本文使用数组实现堆,所以以数组为例:例如:数组[2,1,3,4,5,6,7,8]可以看做是一个类似于完全二叉树的结构。根现在是2,但还不是堆,堆分为最大堆和最小堆。我们以最小堆为例,如果要把这个完全二叉树的数组变成一个堆,我们需要调整它,使其符合根<=左节点,根<=右节点。这里我们也分为两种调整。我们可以向上或向下调整。现在我们用向下调整的方法,从上往下调整,再往下调整只要都需要符合堆的性质,就可以得到最小堆[1,2,3,4,5,6,7,8];上面的定义和大体逻辑分析完了,下面我们就根据这个逻辑分析来做实际的代码,请耐心往下看2.特点:1.堆中某个结点的值总是不大于或不小于其父节点的值2.堆永远是一棵完全二叉树3.堆是非线性数据结构,相当于一维数组,有两个直接后继3.名词:最大堆/大根堆/大顶heap:Thesmallestheapwiththelargestrootnode/Smallrootheap/Smalltopheap:Thesmallestheapwiththerootnode4.实际操作:1.创建堆接口类:/***堆接口类*应用场景:*优先队列*取最大值/最小值*@authorgxw*@date2021/11/421:58晚上*/publicinterfaceHeap{//建堆方法voidbuildHeap(int[]arr);//添加元素voidadd(intg);//替换元素,将第i个位置的元素值替换为gvoidreplace(inti,intg);//删除顶部元素booleanpop();//对堆进行排序voidshift_up(intnow);//对堆进行排序voidshit_down(intnow);//获取最高值intgetTopValue();//显示堆voiddisplay();}2.创建最大堆实现类:/***最大堆,又称大堆,又称大顶堆*@authorgxw*@date2021/11/422:21pm*/公开课马xHeapimplementsHeap{//堆数组privateint[]heapArr;//堆汇总点privateintsize;//堆深度privateintdepth;//堆最大存储节点privateintmaxSize;publicMaxHeap(intmaxSize){这个.maxSize=maxSize;this.heapArr=newint[maxSize];}@OverridepublicvoidbuildHeap(int[]arr){if(arr==null&&arr.length<=0)返回;//构造最大堆for(intg:arr){add(g);}}@Overridepublicvoidadd(intg){//先判断堆是否满if(size==maxSize)return;//添加到堆的末尾heapArr[size]=g;//节点数增加1size++;//判断是否可以加树深度,if2^depth-1大小)返回;//修改值heapArr[i-1]=g;//调整shift_up(i);}@Overridepublicbooleanpop(){if(size==0)返回false;//去掉最大值(大根值),最后一个值赋给大根值heapArr[0]=heapArr[size-1];//节点数减一大小--;//向下调整,1代表第一个逻辑值,不是第一个shit_down(1);返回真;}@Overridepublicvoidshift_up(intnow){//now逻辑值,不代表物理数组下标,需要减一for(inti=0;iheapArr[parentIndex]){//Exchangeinttemp=heapArr[parentIndex];heapArr[parentIndex]=heapArr[nowIndex];heapArr[nowIndex]=temp;//然后继续从当前往上判断now=parentIndex+1;}else{//如果不大于,结束调整break;}}}@Overridepublicvoidshit_down(intnow){//now逻辑值,不代表物理数组的下标,需要减一for(inti=0;iheapArr[2*now]?2*现在-1:2*现在;intnowIndex=now-1;//因为是数组,所以索引为-1//判断当前数是否小于子节点点,小于则交换if(heapArr[nowIndex]size)return;//修改值heapArr[i-1]=g;//调整shift_up(i);}@Overridepublicbooleanpop(){if(size==0)返回false;//去掉最小值(大根值),最后一个值赋给大根值heapArr[0]=heapArr[size-1];//节点数减一大小--;//向下调整,1代表逻辑第一个Value,不代表第一个shit_down(1);返回真;}@Overridepublicvoidshift_up(intnow){//now逻辑值,不代表物理数组下标,需要减一for(inti=0;iheapArr[sonIndex]){//交换inttemp=heapArr[sonIndex];heapArr[sonIndex]=heapArr[nowIndex];堆pArr[nowIndex]=temp;//从当前状态继续判断now=sonIndex+1;}else{//如果不小于,结束调整break;}}}@OverridepublicintgetTopValue(){returnheapArr[0];}@Overridepublicvoiddisplay(){for(inti=0;i