· 学后心得体会与部分习题实现

心得体会:

曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E>中的优先队列封装类,但是没有看过源码,也并不曾知道实现方法用到了堆结构。

优先队列通过堆进行插入元素和删除最小元素的两种高效操作来维护元素集合,每个操作的时间都为对数级(logN)。堆结构及其操作符合优先队列的全部特点,另附有高效率,用来描述与实现优先队列再合适不过。

在学习过程中,在对于堆结构众多操作的巧妙操作中,令我印象深刻的是两种操作:swim() 和 sink()操作,即对于新元素或者删除最大(或最小)根节点后的新根的上浮和下沉操作(有些教材上称为上滤和下滤操作。其命名个人YY的含义是:由于swim() 和sink() 操作是用在insert() 和 delMax() 两个方法中的子方法,用于过滤二叉堆,使其重构成完全二叉树结构。)。

该方法的效率证明可以参看《Introduction to Algorithm》(《算法导论》)中的 6.2 维护堆的性质:

通过对优先队列的学习,自己用Java实现了一下。并可以用以下这个个人编写的二叉堆的实现,完成《Algorithms 4th Edition》中的2.4.1和2.4.6。

 1 import java.math.*;
 2
 3 public class MaxPQ<Key extends Comparable<Key>> {
 4     private Key[] pq;
 5     private int N = 0;
 6
 7     @SuppressWarnings("unchecked")
 8     public MaxPQ(int maxN) {
 9         pq = (Key[]) new Comparable[maxN + 1];
10     }
11
12     public boolean isEmpty() {
13         return N == 0;
14     }
15
16     public int size() {
17         return N;
18     }
19
20     public void insert(Key v) {
21         pq[++N] = v; swim(N);
22     }
23
24     private void exch(int i, int j) {
25         Key t = pq[i]; pq[i] = pq[j]; pq[j] = t;
26     }
27
28     public Key delMax() {
29         Key max = pq[1];
30         exch(1, N--);
31         pq[N + 1] = null;
32         sink(1);
33         return max;
34     }
35
36     private boolean less(int i, int j) {
37         return pq[i].compareTo(pq[j]) < 0;
38     }
39
40     private void swim(int k) {
41         while(k > 1 && less(k / 2, k)) {
42             exch(k / 2, k);
43             k  =k / 2;
44         }
45     }
46
47     private void sink(int k) {
48         while(2 * k <= N) {
49             int j  = 2 * k;
50             if(j < N && less(j, j + 1)) j++;
51             if(!less(k, j)) break;
52             exch(k , j);
53             k = j;
54         }
55     }
56
57     public void prtPQ() {
58         for(int i = 1; i <= N; i++) {
59             System.out.print(pq[i] + " ");
60         }
61         System.out.println();
62     }
63 }

以下是对应部分题目实现(只给出Main部分):

 1 import java.math.*;
 2 import java.util.*;
 3
 4 public class Main {
 5     public static void main(String[] args) {
 6         MaxPQ<Character> PQ = new MaxPQ<Character>(1000);
 7         String op = "PRIO*R**I*T*Y***QUE***U*E";
 8         int cnt = 0;
 9         for(int i = 0; i < op.length(); i++) {
10             if(op.charAt(i) == '*') {
11                 System.out.println(++cnt + ". Max is " + PQ.delMax());
12             } else {
13                 PQ.insert(op.charAt(i));
14             }
15         }
16
17     }
18 }

2.4.1

运行结果:

 1 import java.math.*;
 2 import java.util.*;
 3
 4 public class Main {
 5     public static void main(String[] args) {
 6         MaxPQ<Character> PQ = new MaxPQ<Character>(1000);
 7         String op = "PRIO*R**I*T*Y***QUE***U*E";
 8         int cnt = 0;
 9         for(int i = 0; i < op.length(); i++) {
10             if(op.charAt(i) == '*') {
11                 PQ.delMax();
12             } else {
13                 PQ.insert(op.charAt(i));
14             }
15             System.out.print(++cnt + ". ");
16             PQ.prtPQ();
17         }
18     }
19 }

2.4.6

 

运行结果:


至此,对于优先队列的学习告一段落。笔者一直相信唯 有坚持者才能把算法学的精通,所以算法的学习之路好会坚持下去。一直用luc的文章 http://zh.lucida.me/blog/on- learning-algorithms/ 来激励自己,相信自己终有一天,能达到自己理想的高度。如此才不后悔。


转载于:https://www.cnblogs.com/Destiny-Gem/p/3800952.html

《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ相关推荐

  1. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第一章 概念和工具(二)

    1.2   基础概念和术语(续) 内核模式和用户模式 l         内核模式和用户模式是处理器的概念,而不是操作系统的概念. l         用户代码运行在用户模式下,操作系统代码运行在内核 ...

  2. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第二章 系统结构 (三)

    硬件抽象层(HAL) HAL是支持可移植性的关键部分,它提供硬件平台的低层接口,隐藏了与硬件相关的细节. Windows内部组件及用户编写的设备驱动程序并不直接访问硬件:它们通过调用HAL例程来保持可 ...

  3. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第二章 系统结构 (二)

    2.4 关键的系统组件 这一节将会深入介绍Windows内部结构和每个关键的系统组件所扮演的角色.下图是Windows核心组件更详细的图,它是2.1节的结构图细化版本. 环境子系统和子系统DLL Wi ...

  4. Real-Time Rendering Fourth Edition读书笔记1

    Real-Time Rendering Fourth Edition读书笔记1:第一章-第四章 思维导图链接: 链接:https://pan.baidu.com/s/1ic8O_y2mHdoc68tE ...

  5. Algorithms, 4th Edition(算法-第四版)源码使用系统配置

    关于-Algorithms, 4th Edition (算法-第四版)源代码在本地机器的运行配置. 其实关于这个教程的使用已经在 Java Algorithms and Clients 页面中写出,并 ...

  6. C语言优先队列作用,C语言实现优先队列(priority queue)

    堆排序是一个比较优秀的算法,堆这种数据结构在现实生活中有很多的应用,比如堆可以作为一个优先队列来使用,作为一个高效的优先队列,它与堆的结构一样,都有最大优先队列,最小优先队列.优先队列priority ...

  7. Practical Python and OpenCV 3rd Edition读书笔记_Chapter8_Smoothing and Blurring平滑与模糊_思维导图

    <Practical Python and OpenCV 3rd Edition>真的是一本非常棒的入门书籍. 它也很薄,只有166页,虽然是纯英文的,如果静下心来认真看一两天就可以读完. ...

  8. The art of computer programming Donald E. Knuth volumn one third edition读书笔记1

    大名鼎鼎knuth的编程艺术,要读一读,特此写下读书笔记,引用网络红人留几手的话,我觉得我是一个艺术家,哈哈. 书的开头是讲读此书步骤,感觉Knuth萌萌哒: 1,请按以下步骤阅读,除非你已经开始读了 ...

  9. 优先队列(priority queue)

    目录 一,优先队列 二,STL优先队列 三,二叉堆实现优先队列 四,二项堆实现优先队列 五,线段树实现优先队列 六,OJ实战 力扣 295. 数据流的中位数 一,优先队列 优先队列可以插入元素.查询最 ...

  10. Algorithms, 4th Edition 算法4精华笔记,通俗理解,算法收集与强化

    JVM 是 java 程序员永远的考题,算法是所有程序员永久的考题.这应该是很多人的共识,不管是谁,学习的路上我们时常遇到迷茫阶段,抓住最根本的东西你永远不会觉得迷失. 年假之前,我就规定自己要完成多 ...

最新文章

  1. Django-View中绕过RSCF验证
  2. Latex算法伪代码使用总结
  3. 将图片处理成圆形_设计基本功!图片处理技巧
  4. python注册登陆程序未响应_SpringBoot实现登录注册常见问题解决方案
  5. Linux 中 的 vi 编辑模式 直接对文件进行修改~
  6. 前端面试instanceof_【面试准备】每日前端面试题 45 (前端校招字节跳动面试4)...
  7. jquery 遍历 each 每个匹配元素规定要运行的函数
  8. 哈理工OJ 1391 Orz odd(规律【没证出来】)
  9. python数据分析之朴素贝叶斯实践
  10. 健康生活 - 四季水果参考
  11. 互联网周刊封面文章:全球网络广告三大趋势
  12. App Tamer for mac怎么用?
  13. JavaScript isArray
  14. React之ref的高阶用法
  15. 手写算法-python代码实现Ridge(L2正则项)回归
  16. it计算机职业评估,最新澳洲技术移民评估ACS 职业评估(计算机IT类)
  17. 参考文献格式,依据 GB/T 7714-2015
  18. 南加大计算机科学硕士费用,南加州大学计算机科学硕士排名第15(2020年TFE Times排名)...
  19. 205 Isomorphic Strings
  20. 如何从API中获取数据(一)

热门文章

  1. PAT-A1053:Path of Equal Weight(普通树的遍历和非递减路径的输出)
  2. 后缀树c语言算法,C语言数据结构之中缀树转后缀树的实例
  3. catalina 无法验证macos_拿什么拯救你,我的macOS Catalina——完整版补救措施来啦...
  4. 自动驾驶 8-3: 递归最小二乘法Recursive Least Squares
  5. 极客大学产品经理训练营 认识产品经理上 第1课总结
  6. c语言在线读程序,用C语言编写简单程序.doc
  7. linux虚拟内存和win,linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的. linux的vm相关参数...
  8. deepin mysql管理工具_[LINUX]DeepIn下基础开发环境搭建
  9. 4. 两个排序数组的中位数
  10. 代价函数的作用(2)--机器学习