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

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig