PriorityQueue 优先队列的实现
PriorityQueue 的 implementation
PriorityQueue即是优先队列。通俗的说就是体育课的时候老师要求从高到低排序,老师能直接一眼看出谁是最高的在班级里。当这个最高的离开的时候,老师也马上能知道下面哪个最高的人。
public class MaxPriorityQueue<T extends Comparable<T>> {
public void insert(T t) {
}
public T max(){}
public T delMax() {}
public boolean isEmpty() {}
public int size() {}
}
MaxPriorityQueue
具体实现的话有很多中,可以使用一个数组来存放所有的对象。每次delMax(删除最大的那个元素的时候)只需要遍历一遍数组 找出最大的返回就可以了。这样子的话Time proportational to O(n), 时间是和n成正比的.
还有另外一种实现方法,是使用heap(堆结构),堆结构如下,可以清楚的知道堆的含义就是,顶层的元素的值比底层的大。一级压一级。

堆一般用数组来实现,从index=1开始(方便计算),index * 2 和 index * 2 + 1 就是左右子元素, index / 2 就是父元素
好了,现在假设你有这样子的一个堆

现在我要插入一个111,我先把111 插入到底部

这个时候破坏了heap的有序,堆有序需要底部的元素小于顶部,所以我们把111 和 111的顶部(以后我会叫parentNode) 进行比较
发现111大于33,所有我需要改变exchange 111 和 33的位置

接着111 和 parentNode比,发现还是大于ParentNode,所以继续改变位置。

继续比较

到了top了,没有元素比111大了。堆又有序了。每次堆因为插入或者删除造成的无须都可以用这样子的操作来挽回。
接着说如何删除一个最大的元素。比如刚才的那个堆,我们要拿到最大的那个元素。
首先我们先把111和 最底部的元素交换位置。并且取出111

现在堆的有序被破坏了。我们要把top部的元素和2个子元素比较大小,如果比子元素小的话,外面就需要交换他们的位置
在这里,我们需要把33 和 100 和 50 比较。把值小的元素放在堆底部。把33 和 Math.max(100, 50)交换位置得到如下

33 比 90 小。 交换他们的位置

这个时候堆又有序了。
Are u Okay
堆的有序性必须得到保证。
每次的插入insert() 和 delMax()的操作所需要的时间与 Log(N)成正比。O(logN)
具体的实现可以参考一下https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/elementary/MaxPriorityQueue.java
每个人的实现都不一样。
PriorityQueue 优先队列的实现的更多相关文章
- 堆结构的优秀实现类----PriorityQueue优先队列
之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...
- 基于PriorityQueue(优先队列)解决TOP-K问题
TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的. 下面我们用简单的Java8代码 ...
- 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)
算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...
- PriorityQueue优先队列用法入门
PriorityQueue是队列的一种,它叫做优先队列,该类实现了Queue接口. 之所以叫做优先队列,是因为PriorityQueue实现了Comparator这个比较接口,也就是PriorityQ ...
- Java学习笔记--PriorityQueue(优先队列)(堆)
PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...
- Java Collection - PriorityQueue 优先队列
总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...
- PriorityQueue(优先队列)
PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆顶为最小值. PriorityQueue 一个基于优先级的无界优先级队列. ...
- PriorityQueue优先队列
概念 PriorityQueue 一个基于优先级的无界优先级队列.优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法.该队列不 ...
- Java 优先队列
Java PriorityQueue 优先队列是一种重要的数据结构,其利用的是小/大顶堆来实现的. Java中提供了PriorityQueue,PriorityQueue是基于小顶堆实现的无界优先队列 ...
随机推荐
- .NetCore中简单使用EasyNetQ
前言 我们在.Net中使用RabbitMQ,最原始的就是基于RabbitMQ.Client进行编码,在这个过程中我们需要通过代码约定和维护队列,Exchange等.如果是自行编码封装通用型的Rabbi ...
- Centos中部署NetCore项目(二)
前言 在centos中部署程序,一般都不会是使用控制台进程直接启动,或者是后台运行.而是一些守护进程管理工具进行管理,例如supervisor. 部署Web相关程序,使用nginx是比较普遍的, 安装 ...
- ner处理数据的方式
ner处理数据的方式biodef load_data(filename): features = [] labels = [] f = open(filename, encoding='utf-8') ...
- leetcode37:path-sum-ii
题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum的路径, 例如: 给出如下的二叉树,sum=22, 5 / \ 4 8 / / ...
- 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
<Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...
- 主题包含一张index.html
有半年之久没有更新新作品了,但这个小小领地我并没有忘记,我会坚持下去,一直在这等你,等你的每次回眸,感恩你的每次驻足,这已经足够成为我坚守的动力和理由,尽管现在有很多不足和不尽人意,也没很多的时间管理 ...
- 无需开发,IT事件接入钉钉的方法详解
1.市场在拥抱钉钉 虎嗅8月30日发表了一篇文章<为什么有很多企业沉迷钉钉无法自拔>,有兴趣的可以去看看,下附文章链接. 文章不短,其中有一部分阐述了:钉钉抓住以人为核心的"智能 ...
- CSP-S 2020 Travels
CSP-S 2020 Travels DAY 0 I hit the board in the morning before departure The rest of the time is dec ...
- linux之DHCP服务
1.DHCP介绍(动态主机配置协议) DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议, 主要用途:给内部网络或网络服务供应 ...
- JUC锁种类总结
在并发编程中有各种各样的锁,有的锁对象一个就身兼多种锁身份,所以初学者常常对这些锁造成混淆,所以这里来总结一下这些锁的特点和实现. 乐观锁.悲观锁 悲观锁 悲观锁是最常见的锁,我们常说的加锁指的也就是 ...