当前位置: 首页 > news >正文

数据结构--优先级队列(堆)

一.优先级队列

概念:队列的元素是遵循先进先出的原则,而优先级队列是优先级最高的先出队列

二.堆

概念:

对一个集合元素,堆是按照完全二叉树的顺序存储方式把数据存储到一维数组

分为大根堆和小根堆

图像:

性质:

堆中某个节点的值总是不大于或不小于其父节点的值;

堆总是一棵完全二叉树。

三.大小堆的模拟实现

可以分为向上和向下过程分为俩种模式

向下过程:

向上过程:

    public void shiftUp(int child){int pre =(child-1)/2;while (pre >= 0) {if(elem[pre]<elem[child]){swap(elem,child,pre);child=pre;pre=(child-1)/2;}else {break;}}}

四.PriorityQueue的模拟实现

public void offer(int value){if(isFull()){grow();}elem[size]=value;shiftUp(size);size++;}public  int poll(){if(isEmpty()){return -1;}int ret =elem[0];size--;swap(elem,0,size);shiftDown(0,size);return ret;}public int peek(){if (isEmpty()){return -1;}return elem[0];}

注意:

利用以上的offer方法(向上过程)就可以创建堆

原理:在一个大根堆或小根堆最后一个空间插入,再向上过程(shifup),就形成了大根堆或小根堆

poll方法原理:将0下标和未下标的值交换位置,尾下标向前一位,在对0这棵树进行调整

优点:由于之前为大根堆或小根堆,交换位置后,只要0下标这棵树不是小根堆或大根堆,只需要向下调整0下标这颗大树即可就能转化为小根堆或大根堆

五.向下过程和向上过程创建堆的复杂度

六.堆排序

过程:

1. 建堆

升序:建大堆

降序:建小堆

2. 利用堆删除思想来进行排序

举例:

七.PriorityQueue的方法和使用

1.方法

2.使用


3.默认创建为小根堆的原因和如何创造出大根堆

八.Top-K问题

TOP-K问题:即求数据集合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

方法1:

public int[] smallestK(int[] arr, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>();for(int i=0;i<arr.length;i++){queue.offer(arr[i]);}int[] ret =new int[k];for(int j=0;j<k;j++){ret[j]=queue.poll();}return ret;}

时间复杂度为:Nlog_{2}

class Bigheap implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}
}
class Solution {public int[] smallestK(int[] arr, int k) {int[] ret =new int[k];if(arr==null||k==0){return ret;}Bigheap bigheap =new Bigheap();PriorityQueue<Integer> queue = new PriorityQueue<>(bigheap);//klogkfor(int i=0;i<k;i++){queue.offer(arr[i]);}//(N-k)logkfor(int j=k;j<arr.length;j++){int max=queue.peek();if(max>arr[j]){queue.poll();queue.offer(arr[j]);}}//klogkfor(int s =0;s<k;s++){ret[s]=queue.poll();}return ret;}
}

时间复杂度为:Nlog_{k}

同过比较第二种方法好一些。

http://www.dtcms.com/a/300578.html

相关文章:

  • 【网络协议安全】任务15:DHCP与FTP服务全配置
  • 点击劫持:潜藏在指尖的安全陷阱
  • Python异步下载实战:asyncio + aiohttp 性能碾压同步请求
  • 算法竞赛阶段二-数据结构(37)数据结构循环链表模拟实现
  • ios UIAppearance 协议
  • CodeBLEU:面向代码合成的多维度自动评估指标——原理、演进与开源实践
  • 笔记本键盘的启用和禁用
  • Python Pandas.cut函数解析与实战教程
  • ASP.NET Core 高并发万字攻防战:架构设计、性能优化与生产实践
  • 「mysql」Mac osx彻底删除mysql
  • 21.OSPF路由协议·多区域
  • 通过v4l2,采集视频,FFmpeg编码压缩封装视频(三)
  • 【模电笔记】—— 波形发生电路(波形振荡器)
  • Keil MDK 嵌入式开发问题:Error: L6218E: Undefined symbol HAL_TIM_PWM_ConfigChannel
  • C++编程入门:从基础到复合类型
  • 逆向入门(43)程序逆向篇-tsrh-crackme
  • SpringBoot 整合 Langchain4j AIService 深度使用详解
  • maven命令详解
  • 栈----5.柱状图中最大的矩形
  • 多模态视觉语言模型FILA-细粒度分辨率融合策略
  • 前缀和-560.和为k的子数组-力扣(LeetCode)
  • 望言OCR视频字幕提取2025终极评测:免费版VS专业版提全方位对比(含免费下载)
  • 3D芯片香港集成:技术突破与产业机遇全景分析
  • sealos 方式安装k8s5节点集群
  • CentOS 9 配置国内 YUM 源
  • Flutter开发实战之CI/CD与发布流程
  • Java AI面试实战:Spring AI与RAG技术落地
  • MySQL - 主从复制与读写分离
  • VILA系列论文解读
  • 预处理详解