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 优先队列的实现的更多相关文章

  1. 堆结构的优秀实现类----PriorityQueue优先队列

    之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap.他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快 ...

  2. 基于PriorityQueue(优先队列)解决TOP-K问题

    TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的. 下面我们用简单的Java8代码 ...

  3. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  4. PriorityQueue优先队列用法入门

    PriorityQueue是队列的一种,它叫做优先队列,该类实现了Queue接口. 之所以叫做优先队列,是因为PriorityQueue实现了Comparator这个比较接口,也就是PriorityQ ...

  5. Java学习笔记--PriorityQueue(优先队列)(堆)

    PriorityQueue(优先队列)实际上是一个堆(不指定Comparator时默认为最小堆)队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则.队列的头是按指定排序 ...

  6. Java Collection - PriorityQueue 优先队列

    总结 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(na ...

  7. PriorityQueue(优先队列)

    PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆顶为最小值. PriorityQueue 一个基于优先级的无界优先级队列. ...

  8. PriorityQueue优先队列

    概念 PriorityQueue 一个基于优先级的无界优先级队列.优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法.该队列不 ...

  9. Java 优先队列

    Java PriorityQueue 优先队列是一种重要的数据结构,其利用的是小/大顶堆来实现的. Java中提供了PriorityQueue,PriorityQueue是基于小顶堆实现的无界优先队列 ...

随机推荐

  1. 01 . Go语言的SSH远程终端及WebSocket

    Crypto/ssh简介 使用 下载 go get "github.com/mitchellh/go-homedir" go get "golang.org/x/cryp ...

  2. 第4章 Function语意学

    第4章 Function语意学 目录 第4章 Function语意学 4.1 Member的各种调用方式 Nonstatic Member Function(非静态成员函数) virtual Memb ...

  3. Elasticsearch原理解析与性能调优

    基本概念 定义 一个分布式的实时文档存储,每个字段 可以被索引与搜索 一个分布式实时分析搜索引擎 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据 用途 全文检索 结构化搜索 分 ...

  4. 5分钟GET我使用Github 5 年总结的这些骚操作!

    我使用 Github 已经有 5 年多了,今天毫无保留地把自己觉得比较有用的 Gihub 小技巧送给关注 JavaGuide 的各位小伙伴. 这篇文章肝了很久,就挺用心的,大家看内容就知道了. 如果觉 ...

  5. 找出"吸血鬼数"(Java)

    吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序.以两个0结尾的数字是不允许的,例如,下列数字都是 " ...

  6. mybatis 字符串比较 == 用法

    private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...

  7. GMP-C/C++(大数库)使用方法

    The GNU Multiple Precision Arithmetic Library(GNU 高精度算数库)是一个用于任意精度算术的免费库,可处理带符号整数,有理数和浮点数.除了运行GMP机器中 ...

  8. Netlink 内核实现分析 1

    Netlink 是一种IPC(Inter Process Commumicate)机制,它是一种用于内核与用户空间通信的机制,在一般情况下,用户态和内核态通信会使用传统的Ioctl.sysfs属性文件 ...

  9. uboot分析——初始化

    1.start.S 初始化 icache 看门狗 时钟 DDR 设置栈 初始化串口,并打印 OK 以上完成 lowlevel_init -------------------------------- ...

  10. istio in kubernetes (一) --原理篇

    背景 微服务是什么 • 服务之间有轻量级的通讯机制,通常为REST API • 去中心化的管理机制 • 每个服务可以使用不同的编程语言实现,使用不同的数据存储技术 • 应用按业务拆分成服务,一个大型应 ...