二叉堆(优先队列)

【0】README

0.1) 本文总结于 数据结构与算法分析,但源代码均为原创;旨在理清二叉堆(优先队列) + 堆的其他操作及其应用, 以便让朋友些知道为什么要学习优先队列;


【1】二叉堆

1.0)优先队列定义:优先队列是允许至少下列两种操作的数据结构,insert(插入), 它的工作时显而易见的,以及 deleteMin(删除最小者), 它的工作是找出、返回和删除优先队列中最小的元素;
1.1)我们把二叉堆中只叫做堆, 堆也有两个性质:结构性和堆序性;对堆的 insert and deleteMin 操作必须要到堆的所有性质都被满足时才能终止;
1.2)结构性质

  • 堆是一棵被完全填满的二叉树,其底层上的元素从左到右填入,这样的树称为 完全二叉树;完全二叉树 的高是 logN(向下取整), 显然它是 O(logN);
    这里写图片描述
  • 堆数据结构将由一个数组(不管关键字是什么类型)、一个代表最大值的整数及当前的堆大小组成;

1.3) 堆序性质

  • 1)堆序性:使操作被快速执行的性质是 堆序性;由于我们想要快速找出最小元,因此最小元应该在根上;依据树的递归定义,则任意节点就应该小于它的后裔;

【2】基本的堆操作

2.1)insert 插入:为将一个元素X 插入到堆中, 在下一个空闲位置创建一个空穴, 否则该堆将不是完全树;如果X 可以放在该空穴中而并不破坏堆的序, 那么插入完成, 否则, 我们把空穴的父节点上的元素移入该空穴中;(这种一般策略叫做 上滤, 新元素在堆中上滤直到找出正确的位置);
这里写图片描述
2.2)deleteMin(删除最小元):找出最小元容易,困难是删除它;当删除一个最小元时, 在根节点处产生了一个空穴, 由于现在堆少了一个元素,因此对中最后一个元素 X 必须移动到堆的某个地方;如果X 可以被放到空穴中,那么 deleteMin 完成;显然这一般不可能, 因此我们将空穴中的较小者移入空穴, 这样就把空穴向下推了一层;重复该步骤直到 X 可以被放入空穴中;因此,我们的做法是将 X 置入沿着从根开始包含最小儿子的 一条路径上的一个正确的位置;(这种策略叫做下滤);
这里写图片描述
这里写图片描述
2.3)出现的问题+解决方法

  • 出现的问题:在堆实现中, 经常发生的错误是当堆中存在偶数个元素的时候, 此时将遇到一个节点只有一个儿子的情况, 我们必须保证假设节点不总有两个儿子;
  • 解决方法:始终保证你的算法把每一个节点都看成有两个儿子;

【3】源代码+printing

3.1)download source code :
https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6
3.2)代码详情+打印效果参见
http://blog.csdn.net/PacosonSWJTU/article/details/49498255
“【2】source code+printing”部分,因为二叉堆(优先队列)的基本操作 和 其他高级的应用操作的实现代码我都放到一起的;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java自定义外部接口_如何使用可外部化的接口在Java中自定义序列化

java自定义外部接口在上一篇文章“用示例介绍的有关Java序列化的一切”中 ,我解释了如何使用以下方法序列化/反序列化一个对象 Serializable接口,还说明了如何使用writeObject和readObject方法自定义序列化过程。 Java序列化过程的缺点 但是这些自定义…

python训练营朋友圈留言_用Python发一个高逼格的朋友圈【附代码】

今天二胖要给大家介绍一个Python库:PIL(Python Image Library)下面我们用一个实际的例子看看50行python代码可以做什么神奇的事情这是二胖发的一个朋友圈切图前是一张图切图后就是九张图啦成功霸屏除了可以处理规整的正方形图片还可以处理非规则的图片比如下面这张宽…

vim 编辑器的快捷键

文章目录命令终端界面滚屏命令终端页签切换缓存区切换/文件切换分割窗口/打开新窗口切换窗口移动/旋转/移出窗口关闭窗口调整窗口大小底行命令模式下的编辑快捷键vim 很多指令或者快捷键是大小写敏感。命令终端界面滚屏 快捷键说明Fn ←向上滚屏到开始处Fn →向下滚屏到末尾…

关于二叉堆(优先队列)的其他操作及其应用

【0】README 0.1)本文总结于 数据结构与算法分析;源代码均为原创, 旨在了解到我们学习了优先队列后,还能干些什么东西出来, 增加学习的interest; 0.2)以下列出了 关于二叉堆(优先队…

gradle junit5_JUnit 5和Selenium –使用Gradle,JUnit 5和Jupiter Selenium设置项目

gradle junit5Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行通信的协议)和浏览器驱动程序。 Sele…

ubuntu 两块硬盘挂载不上_win10 轉 Ubuntu

目前用了win10兩三年。發現越來越慢,況且已習慣mac OS,所以想用自己的機子來裝個雙系統Linux,慢慢的將win的東西都轉到Ubuntu上。已清空一個磁盤300G,打算就是在這300G裡裝一個Ubuntu,不知道是否夠用(雖然很想裝在三星…

包+类导入+静态导入+类放入包中+包作用域

【0】README 0.1)本文转自 core java volume 1, 旨在理清 包和类导入的相关知识; 【1】 包 1.1) java 允许使用包将类组织起来,包可以方便组织代码,并将自己的代码与别人提供的代码库分开管理&#xff1b…

selenium自动化测试_使用Selenium自动化测试处理多个浏览器选项卡

selenium自动化测试使用Selenium进行自动化测试一直是将萌芽的自动化测试人员培养为专业人员的生命线。 Selenium是开源的,在全球范围内被广泛采用。 结果,您会得到社区的大力支持。 提供了与Selenium绑定的不同语言的多种框架。 因此,您已经…

qt和c#怎么选_请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?

回答问题之前,先装个逼——没有主导过生命周期三年以上的桌面软件项目的,闭嘴。你连一个桌面软件项目的生命周期都没经历过,你凭什么做技术选型?凭信仰吗?装逼结束,正文开始。首先,非主流技术和…

java 白皮书的关键术语

【0】README 0.1) 本文转自 core java volume 1,仅供了解,所谓爱屋及乌嘛; 0.2) java的设计者编写了颇有影响力的白皮书,用来解释设计的初衷以及完成的情况,并发布了一个摘要;【1】…

当集合a为空集时a的取值范围_高中数学必修一第一章集合分节练习和章末测试题含答案[1] 2...

高中数学必修1 第一章 集合 分节练习和章末综合测试题含答案1 集合的含义与表示1、下列各组对象能否组成一个集合?(1)接近于0的数的全体; (2)2的近似值的全体; (3)平面上到点O 的距离等于1的点的全体; (4)正三角形的全体&#xff…

spring jpa 流式_从响应式Spring Data存储库流式传输实时更新

spring jpa 流式这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行流更新的幼稚实现。 更准确地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件。 对R2DBC和Spring的一点背景知识将对这篇文章有所帮助。 我以前的著作《 使用 Microsoft S…

弹窗页面交互_UI进阶知识-信息提交类弹窗该如何设计?

原文作者:风筝KK 信息提交类弹窗大家应该都比较熟悉,和其他弹窗的区别在于他有输入、选择等操作,比如我们常见的输入验证码、留言回复、充值转账、任务设置等。看上去设计都比较简单,但是当你验收时就会发现问题,为什么…

selenium并行_如何在不同的浏览器中设置Selenium网格以并行执行

selenium并行到目前为止,Selenium是最常用的Web自动化测试工具。 如此受欢迎的原因之一是Selenium的自动跨浏览器测试功能。 Selenium自动化测试可以帮助您在所有主要浏览器,所有主要操作系统甚至移动设备浏览器上进行测试。 您可以在所有功能测试中获得…

java 发展简史

【0】README 0.1) 本文转自 core java volume 1,仅供了解Java 的发展历史,它的前世今生,所谓知己知彼,百战不殆(just a joke) ; 【1】java 发展简史 1.1)java的历史要…

axios代理跨域 cli4_跨域本质及解决办法

1、什么是跨域?2、如何解决?跨域是前端所独有的,后端不存在跨域问题。是浏览器的一种安全保护手段,为了防止别人抓取、篡改你的网站数据信息。遵循同源策略、同协议(http)、同域名、同端口,少一…

如何使用eclemma插件_如何集成和使用EclEmma插件来获得良好的Junit覆盖率

如何使用eclemma插件你好朋友, 如果编写好的代码很重要,那么编写覆盖所有业务逻辑的优良Junit测试用例也同样重要。通过编写覆盖业务逻辑的Junit测试用例,我们实际上确保代码的每种方法都能正常工作按照预期进行,因此减少了在软…

Java 相关术语

【0】README 0.1) 本文转自 core java volume 1,仅供了解Java 的相关术语,包括像JDK、JRE等 ;而且我感觉,了解了这些过后,你会更懂 Java, 更热爱它; 【2】Java术语 2.1)…

一般试卷的纸张大小是多少_pdf试卷怎么打印在A3纸上

一般的PDF试卷的纸张大小都是A4大小,没有现成A3大小Word文档的试卷时,需要将PDF试卷转换Word文档之后进行排版,如何实现这一操作呢?请接着往下学习吧~一、将试卷的PDF格式转换为Word1.进入PDF快转官网,点击下载按钮下载…

设置 JDK环境变量(Windows)

【0】README 0.1) 本文转自 core java volume 1,旨在说明如何设置 JDK环境变量,以及为什么要设置的问题;【1】JDK目录树 Attention)就Java 而言, docs 和 src 是两个最有用的子目录:因为 docs …