总结

  1. 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator,类似于C++的仿函数)。
  2. Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)。
  3. Java中使用数组的形式保存小顶堆的结构。父节点和子节点的编号是有联系的,更确切的说父子节点的编号之间有如下关系:
leftNo = parentNo*2+1

rightNo = parentNo*2+2

parentNo = (nodeNo-1)/2

PriorityQueue解析

详细内容

  • PriorityQueue 继承关系
  • add() & offer() 源码 -- add(E e)和offer(E e)的语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后则则会返回false。对于PriorityQueue这两个方法其实没什么差别。
  • peek() 源码
  • remove() & poll() 源码 -- remove()和poll()方法的语义也完全相同,都是获取并删除队首元素,区别是当方法失败时前者抛出异常,后者返回null。由于删除操作会改变队列的结构,为维护小顶堆的性质,需要进行必要的调整。

参考链接

PriorityQueue 时间复杂度

  • Binary heap (二叉树堆), Java默认使用, 也就是第一行。
  • Fibonacci heap (斐波那契堆),Strict Fibonacci(严格斐波那契堆)理论性能最好 --> 记住大体概念,结论即可
  • Binomial heap(二项堆)

Fibonacci heap (斐波那契堆)的优缺点

Fibonacci heap (斐波那契堆)的优点:

 斐波那契堆的结构较二项堆更松散。因此对结构的维护可以到方便时再做。

  • 1.二叉堆及二项堆在插入一个结点后,会马上维护堆的结构...而FIB堆却将这个工作延迟到FIB_EXTRACT_MIN的时候再做....使元素的插入的时间为O(1)
  • 2.二叉堆及二项堆在改变一个结点的值的时候,会马上维护堆的结构...而FIB堆却将这个工作延迟到FIB_EXTRACT_MIN的时候再做....使元素的值的改变的时间为O(1)
  • 3.堆的合并..FIB堆只需要将两个堆的根表合并就可以了   O(1)

 

Fibonacci heap (斐波那契堆)的难点:

FIB_EXTRACT_MIN()...提取最小的值。

  • 1.将min结点的儿子都加入到根表
  • 2.在根表中除去min结点
  • 3.合并堆的根表,即减少根表中堆的数目,直到根表中每个根的度都不相同(用merge()函数)

最新文章

  1. web应用和虚拟目录映射
  2. 1Z0-053 争议题目解析707
  3. rsyslog及logrotate小结
  4. OpenFileDialog - 设置 - Filter 笔记
  5. Objective C 基础
  6. 20145305 《Java程序设计》第6周学习总结
  7. IOS PUSH 实践操作~~~~
  8. include .h 以及.cpp的记录
  9. android 遇到的细节 FAQ
  10. Scrapy的架构初探
  11. POJ 1159 - Palindrome 优化空间LCS
  12. SURF分析算法
  13. DX11 Without DirectX SDK--02 渲染一个三角形
  14. java PageHelper 分页插件出现 Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Duplicate column name 'Id' 错误
  15. 1.初步认识TypeScript
  16. postman:模拟发送一个需要cookie认证的请求
  17. python开发之路目录
  18. Pyhont:内建函数enumerate
  19. shell 切分文件名提取文件扩展名或提取文件名
  20. location 符号

热门文章

  1. css实现下拉框导航条
  2. 巨好看的xshell配色
  3. 安装JDK,并检测JDK是否安装成功
  4. JavaSE---多线程---线程组
  5. 深入java虚拟机学习笔记(一)
  6. mysql中int的长度与值的问题
  7. Android数字签名的学习(转)
  8. EditText的常用点,输入控制(包含inputType)
  9. *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 、*.tar.bz2用tar –xjf 解压
  10. CJE-Jenkins认证工程师考试预约报名流程