用java实现队列结构,java实现栈和队列数据结构
Heap(优先级队列)是一种典型的数据结构,其形状是一棵完全二叉树,一般用于解决topk问题。根据父节点是大于等于子节点还是小于等于子节点,可以分为大顶堆和小顶堆。本文实现了大堆顶。
根据大顶堆的定义,大顶堆的父节点大于等于其子节点,顶元素最大。对于每个子树,它是一个大的顶部堆。然后,可以从最后一个父节点调整到根节点,建立一个大的顶堆。
这里我们用数组来存储,以heap={3,2,1,5,6,4}为例。我们需要一个init(int[] heap)初始化方法,从最后一个父节点开始逐步将堆调整为大顶堆,其中需要用到adjust(int[] heap,int i,int end)方法。
调整过程:从最后一个父节点开始,如果当前父节点所扎根的树不符合大顶堆,则进行调整。
代码实现如下:
Public void init(int[] heap) {//从最后一个父节点开始调整//逐渐向上调整for(int I=heap.length/2; I 0;i - ) { this.adjust(heap,I,heap . length);} } public void adjust(int[] heap,int i,int end){ int j=I 1;While (j=end) {//在两个子节点Z { j=j 1;中找出较大的节点if(j end heap[j-1]heap[j]);}//如果较大的节点仍然小于根节点,那么以当前节点为根节点的//二叉树已经是一个大顶堆,不需要调整If(heap[I-1]heap[j-1]){ break;}//Adjust,将当前节点换到更大的位置,然后从当前位置开始调整int temp=heap[I-1];heap[I-1]=heap[j-1];heap[j-1]=temp;I=j;j=I ^ 1;}}}大顶堆建好之后,怎么才能得到topk呢?这个时候堆的顶元素是top1,我们只需要取top1元素,把剩下的元素调整到大顶堆,K次之后就可以得到topk了。
具体流程:我们把最上面的元素和最后一个元素交换,然后把最上面的调整到倒数第二个元素,以此类推。
以leetcode215数组中第k个最大元素为例:
给定一个整数数组nums和一个整数k,请返回数组中第k个最大的元素。
请注意,你需要在数组排序后找到k个最大的元素,而不是k个不同的元素。
public int findKthLargest(int[]nums,int k){ this . init(nums);//求第k个最大数int end=nums.lengthWhile (k 1) {//将当前堆顶元素放在最后,进行堆调整int temp=nums[0];nums[0]=nums[end-1];nums[end-1]=temp;end=end-1;-k;this.adjust(nums,1,end);} return nums[0];}
另外,Java本身提供了优先级队列集合类,但效率不如自己实现。
public int findKthLargest(int[]nums,int k){ PriorityQueueInteger priority queue=new priority queue(k);for(int num : nums){ if(priority queue . size()==k){ if(num priority queue . peek()){ priority queue . poll();priorityQueue.add(数字);}继续;} priority queue . add(num);} return priority queue . poll();}
关于Java数据结构堆(优先级队列)的实现,本文到此为止。更多相关Java堆内容,请搜索热门IT以前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。