目录

1.优先级队列(堆)概念:

1.2现实中的优先级队列PriorityQueue

1.2.1手术排期

1.2.2操作系统的任务调度

​编辑

2.堆(heap,基于二叉树)

2.1堆逻辑上是一颗完全二叉树

2..2关于节点值

2.3关于下标

3.堆的基础表示

3.1向堆中添加元素siftup

3.2在堆中取出最大值(最大堆)

4.heapify - 堆化

5.在java中比较两个元素的大小关系:

6.堆的应用-优先级队列(Topk问题)

6.1概念

6.2应用


1.优先级队列(堆)概念:

按照优先级的大小动态出队(动态指的是元素个数动态变化,而非固定)。

普通队列:FIFO。按照元素的入队顺序出队,先入先出。

1.2现实中的优先级队列PriorityQueue

1.2.1手术排期

1.2.2操作系统的任务调度

2.堆(heap,基于二叉树)

2.1堆逻辑上是一颗完全二叉树

(不用存储空节点值)

2..2关于节点值

2.3关于下标

3.堆的基础表示

3.1向堆中添加元素siftup

3.2在堆中取出最大值(最大堆)

4.heapify - 堆化

5.在java中比较两个元素的大小关系:

6.堆的应用-优先级队列(Topk问题)

6.1概念

在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。

在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级的对象,一个是添加新的对象。这种数据结构就是优先级队列(PriorityQueue)

6.2应用

  public int[] smallestK(int[] arr, int k) {int[] ret = new int[k];if (arr.length == 0 || k == 0) {return ret;}// JDK默认是一个最小堆,需要改成一个最大堆// Lambda表达式Queue<Integer> queue = new PriorityQueue<>((o1,o2) -> o2 - o1);
//        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1;
//            }
//        });// 遍历原集合,队列只保存k个元素for (int i = 0; i < arr.length; i++) {if (queue.size() < k) {queue.offer(arr[i]);}else {int max = queue.peek();if (arr[i] < max) {queue.poll();queue.offer(arr[i]);}}}// 此时队列中就保存了前k个最小值元素,依次出队即可int i = 0;while (!queue.isEmpty()) {ret[i ++] = queue.poll();}return ret;}

public class LC347TokFreqNum { public int[] topKFrequent(int[] nums, int k) {int[] ret = new int[k];// 1.先扫描原数组,将出现的元素以及其频次保存到Map集合中。// [1,1,1,2,2,3] => {{1 : 3},{2 : 2}, {3 : 1} }Map<Integer,Integer> map = new HashMap<>();for (int i : nums) {
//            if (map.containsKey(i)) {
//                // 此时元素i已经出现过,只要将频次 ++ 即可
//                int times = map.get(i);
//                map.put(i,times + 1);
//            }else {
//                // 此时i第一次出现,就将该元素保存到map中
//                map.put(i,1);
//            }// 若i对应的元素在Map中不存在,返回0 + 1map.put(i,map.getOrDefault(i,0) + 1);}// 2.扫描Map集合,将出现频次最高的前k个元素添加到优先级队列中Queue<Freq> queue = new PriorityQueue<>();for (Map.Entry<Integer,Integer> entry : map.entrySet()) {if (queue.size() < k) {queue.offer(new Freq(entry.getKey(),entry.getValue()));}else {// 判断堆顶元素和当前元素的出现频次// 只有当前元素的出现频次 > 堆顶元素,入队,打擂思想,不断将出现频次大的元素对换入到队列中Freq freq = queue.peek();if (entry.getValue() > freq.value) {queue.poll();queue.offer(new Freq(entry.getKey(),entry.getValue()));}}}// 3.此时队列中就保存了出现频次最大的前k个数对 - k个Freq对象// 遍历队列,将Freq对象中的key取出放入结果集中即可int i = 0;while (!queue.isEmpty()) {ret[i ++] = queue.poll().key;}return ret;}
}
class Freq implements Comparable<Freq> {// 数组中出现的元素int key;// 该元素出现的频次int value;public Freq(int key, int value) {this.key = key;this.value = value;}@Overridepublic int compareTo(Freq o) {return this.value - o.value;}
}

public class LC373_KSmallestPairs {/*** 查找和最小的k对数字* @param nums1* @param nums2* @param k* @return*/public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {//1.创建优先级队列,其中队列中保存比较对象,传入比较器,和越小反而越大Queue<Pair> queue = new PriorityQueue<>(new Comparator<Pair>() {@Overridepublic int compare(Pair o1, Pair o2) {return (o2.u + o2.v) - (o1.u + o1.v);}});//2.遍历两个数组,其中u来自第一个数组,v来自第二个数组//队列中保存了和最小的k个数对for (int i = 0;i < Math.min(nums1.length, k);i++){for (int j = 0;j < Math.min(nums2.length, k);j++){if (queue.size() < k){queue.offer(new Pair(nums1[i],nums2[j]));}else{int add = nums1[i] + nums2[j];Pair pair = queue.peek();if (add < (pair.u + pair.v)){queue.poll();queue.offer(new Pair(nums1[i],nums2[j] ));}}}}// 3.此时队列中就保存了和最小的前k个Pair对象,取出其中u和v即可List<List<Integer>> ret = new ArrayList<>();while (!queue.isEmpty()) {List<Integer> temp = new ArrayList<>();Pair pair = queue.poll();temp.add(pair.u);temp.add(pair.v);ret.add(temp);}return ret;}
}
class Pair{int u;int v;public Pair(int u,int v) {this.u = u;this.v = v;}
}

数据结构——优先级队列(堆)相关推荐

  1. java优先级队列(堆)

    文章目录 一.优先级队列是什么? 二.堆 什么是堆? 堆的分类: 堆的存储 堆的创建 三.堆的操作 插入元素 弹出元素 四.用堆模拟实现优先级队列 一.优先级队列是什么? 在数据结构中,普通的队列是先 ...

  2. 邓俊辉 数据结构 优先级队列

    概述(需求和动机) 概述(基本实现) 完全二叉堆(结构) 题目: 关于完全二叉树的疑问 这里完全二叉树和平衡因子处处非负的AVL树应该在这里的意思应该不是等价的吧?(by 骑马督战官 ) 答:对,不等 ...

  3. 数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列

    目录 堆的概念 堆的存储方式 堆的相关操作 堆的向下调整. 堆的创建 堆的插入和向上调整 堆的删除 用堆模拟优先级队列 堆的概念 堆是逻辑结构为二叉树存储结构为数组数组的一种数据结构,为什么这么说呢? ...

  4. 优先级队列--大根堆和小根堆

    概述 与FIFO的普通队列不同,在优先级队列中,元素出队顺序是由元素的优先级决定.比如大根堆是最大的元素先出队,小根堆是最小的元素先出队. 堆是实现优先级队列效率很高的数据结构(当然我们也可以使用无序 ...

  5. 什么是java优先级队列_什么是Java优先级队列(Priority Queue)?

    39 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索.无论何时调用remove方法,总会获得当前优先级队列中的最小元素,但并不是对所有元素都排序.它是采用了堆(一个可以自我调整 ...

  6. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  7. 《恋上数据结构第1季》二叉堆实现优先级队列

    优先级队列(Priority Queue) 优先级队列简介 优先队列的底层实现 二叉堆实现优先级队列源码 测试代码 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基 ...

  8. 使用最小堆使用优先级队列(c语言版本)

    下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...

  9. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

最新文章

  1. 今日头条告今日油条赔 200 万,各大公司表示不服
  2. 研发日烧6400万的百度发出新讯号,李彦宏:自动驾驶订单已是全球第一
  3. 用宏定义实现函数值互换
  4. Redis的持久化机制-RDB方式和AOF方式
  5. Qt Creator创建组件
  6. 起底《最后生还者2》:开发者们设计剧情应该规避的误区
  7. C代码+汇编 C的for汇编学习分析
  8. 详解JSONObject.parseObject和JSONObject.fromObject——Web网络系列学习笔记
  9. Makefile 入门教程
  10. 蓝桥杯c语言基础试题答案,2014年蓝桥杯c语言试题及答案
  11. 慢慢欣赏linux 串口驱动架构
  12. 通天阁塔机器人图片_CORNER | 大阪 · 东京铁塔也比不过跟你一起看的通天阁
  13. 余世维有效沟通全文字!
  14. 投入产出模型中的经济分析(直接消耗系数等)
  15. RabbitMQ之延迟队列
  16. Python读文件的三种方法对比
  17. ACL(访问控制列表)
  18. MySQL医疗信息管理系统数据库(源码)
  19. 如何让代码在word中显示行号?
  20. 图像透视投影变换 四边形——标准矩形

热门文章

  1. 示例演示“距离矢量路由算法”工作原理
  2. 雷达坐标系之间的转换
  3. Linux之父炮轰:C++是一门很烂的语言,不会用其重写Linux内核
  4. el-dropdown-item添加点击事件
  5. 删除word文档导航栏的“已共享“内容
  6. zookeeper和并发概念
  7. nginx高并发性能调优
  8. 我的世界服务器无限时间,我的世界:运行时间最长的服务器,新玩家都不知道它更新了多少次...
  9. 【那些年我们一起挖过的坑】uploadify插件的兼容性
  10. 反爬虫的几种header