20162321-王彪-程序设计与数据结构-第九周学习总结

2024-02-03 15:40

本文主要是介绍20162321-王彪-程序设计与数据结构-第九周学习总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

堆和优先队列

学习目标

  • 定义堆并讨论它的特殊用途
  • 讨论堆的链式实现方式
  • 讨论堆排序
  • 定义优先队列和它与堆的关系

1.堆和二叉查找树
  • 堆是一棵完全二叉树,其每个元素都要小于或大于他所有的孩子,若每个元素都大于它的孩子则称之为最大堆,若都小于它的孩子则称之为最小堆。
  • 二叉查找树是一棵二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,而右子树上的元素大于等于父结点的值。
2.堆的基本操作
  • 向堆中添加一个元素

策略:
(一)将元素添加为新的叶节点,同时保持树是完全树。
(二)将该元素向根的方向移动,将它与父结点对换,直到其中的元素关系满足要求为止。

  • 书中以最大堆为例,图例为最小堆
    1065456-20171105095518091-512046993.png

1065456-20171105095526935-1276106712.png

1065456-20171105095533279-1502947712.png

1065456-20171105095541201-1329304329.png

  • 从堆中删除最大值元素

策略:
(一)删除树的“最后”的叶节点(最后一层最右边的叶节点),将其放置的到根上。
(二)然后将它在树中下移至满足元素关系的位置。(类似在树中添加新元素的逆过程)
(三)将新根元素与他的孩子进行比较,从而判定它是否需要向下移动(如果根元素小于它的较大孩子,则交换它们。继续此过程,知道两个孩子都小于等于这个元素时为止)

  • 书中以最大堆,为例,图例为最小堆
    1065456-20171105155403232-459719728.png

1065456-20171105155430763-1563028608.png

1065456-20171105155438232-824128575.png

1065456-20171105155444904-275822354.png

1065456-20171105155453013-1276677453.png

3.堆的实现
  • 使用链式结点实现堆

接口:MaxHeap
继承父接口:BinaryTree
所含方法:添加一个新元素,获取最大值,删除最大值
类:LinkedMaxHeap
继承父类:LinkedBinaryTree,实现接口:MaxHeap

  • 方法分析及完善

LinkedMaxHeap中的add方法依赖于HeapNode中的两个支撑方法:

  • getParentAdd
public HeapNode<T> getParentAdd (HeapNode<T> last){HeapNode<T> result = last;while ((result.parent != null) && (result.parent.left != result))result = result.parent;if (result.parent != null)if (result.parent.right == null)result = result.parent;else{result = (HeapNode<T>) result.parent.right;while (result.left != null)result = (HeapNode<T>) result.left;}elsewhile (result.left != null)result = (HeapNode<T>) result.left;return result;}

该方法得到要插入的新结点的父结点。从树中的最后一个结点开始,一个结点一个结点地检测,寻找新加入结点的父结点。

  • (一)在书中向上进行查找,直到发现它是某个结点的左子结点,或是达到根结点时为止。
  • (二)如果达到根结点,则新的父结点是根的最左后继结点。
  • (三)如果没有达到根结点,则再查找右子结点的最左后继。

  • heapifyAdd
public void heapifyAdd (HeapNode<T> last){T temp;HeapNode<T> current = last;while ((current.parent != null) &&((current.element).compareTo(current.parent.element) > 0)){temp = current.element;current.element = current.parent.element;current.parent.element = temp;current = current.parent;}}

该方法的作用是在叶结点插入后重建堆,该过程与向堆中插入新元素的过程是一致的。一旦新的叶节点添加到树中,heapifyAdd方法就利用parent引用沿树向上移动。

优先队列

  • “队列”,表明本质上它是一个队列,数据只能在一端进入,另一端出来,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队。

优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1:查找;2: 插入一个新元素;3: 删除.在最小优先队列中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.。要比较优先级,可能就会用到CompareTo方法乐。

堆的实现方法补充

堆的计算链式实现策略
  • 代码还未成型
堆的存储链式实现策略
  • 代码还未成型
自主堆排序
  • 代码还未成型

转载于:https://www.cnblogs.com/wbiao21/p/7785092.html

这篇关于20162321-王彪-程序设计与数据结构-第九周学习总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674621

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义