数据结构 第六章(堆)PPT教学课件
合集下载
计算机导论-第6章 数据结构

⑴集合结构。在集合结构中,数据元素间的关系是“属于 同一个集合”。集合是元素关系极为松散的一种结构。
单击此处添课程名 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图型结构。该结构的数据元素之间存在着多对多的关系, 图形结构也称作网状结构。
具有特殊的意义,称为栈顶。相应地,表尾 称为栈底。不含任何元素的栈称为空栈。
2. 栈的数学性质
假设一个栈S中的元素为an,an-1,..,a1,则 称a1为栈底元素,an为栈顶元 素。栈中的
元 时素 候按 ,单出a ,a栈击2,的..此,元an素-处1,都an添是的栈次课顶序程元进素栈名。。换在句任话何
第六章 数单据击结此构处添课程名
第6章 数据结构
• 数据结构是计算机软件和计算机应用专业的 核心课程之一,对于学习计算机专业的其他 课程,如操作系统、编译原理、数据库管理
系的统 。、 数软 据单件 结击工 构程主此、要处人研工究添智数能据课等表程都示是 与名十 存储分的有方益
法、抽象的逻辑结构及其上定义的各种基本 操作。数据的逻辑结构常常采用数学描述的 抽象符号和有关的理论。如使用串、表、数 组、图等结构和理论来表示数据在存储时的 逻辑结构,研究这些结构上定义的各种操作 。
本章内容
• 6.1 数据结构的概念 • 6.2 几种典型的数据结构 • 6.3 查找
• 6.4 单排序击此处添课程名
6.1 数据结构的概念
• 在系统地学习数据结构知识之前,先对一 些与数据结构相关的基本概念和术语赋予 确切的含义。
• 数 算机据单识(别D击at、a此)存是储处信和添息加的工课载处体理程,。名它它能是够计被算计机 程序加工的原料,应用程序处理各种各样 的数据。
单击此处添课程名 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图型结构。该结构的数据元素之间存在着多对多的关系, 图形结构也称作网状结构。
具有特殊的意义,称为栈顶。相应地,表尾 称为栈底。不含任何元素的栈称为空栈。
2. 栈的数学性质
假设一个栈S中的元素为an,an-1,..,a1,则 称a1为栈底元素,an为栈顶元 素。栈中的
元 时素 候按 ,单出a ,a栈击2,的..此,元an素-处1,都an添是的栈次课顶序程元进素栈名。。换在句任话何
第六章 数单据击结此构处添课程名
第6章 数据结构
• 数据结构是计算机软件和计算机应用专业的 核心课程之一,对于学习计算机专业的其他 课程,如操作系统、编译原理、数据库管理
系的统 。、 数软 据单件 结击工 构程主此、要处人研工究添智数能据课等表程都示是 与名十 存储分的有方益
法、抽象的逻辑结构及其上定义的各种基本 操作。数据的逻辑结构常常采用数学描述的 抽象符号和有关的理论。如使用串、表、数 组、图等结构和理论来表示数据在存储时的 逻辑结构,研究这些结构上定义的各种操作 。
本章内容
• 6.1 数据结构的概念 • 6.2 几种典型的数据结构 • 6.3 查找
• 6.4 单排序击此处添课程名
6.1 数据结构的概念
• 在系统地学习数据结构知识之前,先对一 些与数据结构相关的基本概念和术语赋予 确切的含义。
• 数 算机据单识(别D击at、a此)存是储处信和添息加的工课载处体理程,。名它它能是够计被算计机 程序加工的原料,应用程序处理各种各样 的数据。
C++课件第六章数组

解决方法
在使用数组之前,应该为其所有元素 分配初始值。可以使用循环来遍历数 组并为每个元素赋值。同时,也可以 考虑使用标准库中的容器类,如 std:vector或std:array,它们可以自 动管理元素的初始化和销毁。
数组下标从0开始还是从1开始
总结词
详细描述
在C中,数组的下标从0开始而不是从 1开始。
C++课件第六章 数 组
目录
CONTENTS
• 数组的概述 • 数组的声明与初始化 • 数组的操作 • 数组的应用 • 数组的常见错误与注意事项 • 练习题与答案
01
数组的概述
数组的概述
• 请输入您的内容
02
数组的声明与初始 化
一维数组的声明与初始化
总结词
一维数组是具有线性结构的数组,可以通过指定数组大小来 声明和初始化。
插入排序
将数组分为已排序和未排序两部分,初始时已排序部分包含一个元素,之后从未排序部分 取出元素,并在已排序部分找到合适的插入位置插入,并保持已排序部分一直有序。重复 此过程,直到未排序部分元素为空。
数组在查找算法中的应用
线性查找
从数组的第一个元素开始,逐个比较,直到找到目标元素或遍历完整个数组。
详细描述
在C中,一维数组的声明需要指定数组的大小,例如int array[10]表示一个包含10个整数的数组。可以通过指定初始 值来初始化数组,例如int array[5] = {1, 2, 3, 4, 5}。如果没 有指定初始值,数组将自动被初始化为0或空值。
二维数组的声明与初始化
总结词
二维数组是具有矩阵结构的数组,可以通过指定行数和列数来声明和初始化。
详细描述
在C中,二维数组的声明需要指定行数和列数,例如int array[3][4]表示一个包含3行4列的二维数组。可以通过指 定初始值来初始化二维数组,例如int array[2][3] = {{1, 2, 3}, {4, 5, 6}}。如果没有指定初始值,数组将自动被初 始化为0或空值。
数据结构 课件PPT

数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据元素(Data Element)
数据元素是组成数据的基本单位,是计算机程序加工处理的基本单位,在计算机中通常 作为一个整体进行考虑和处理。
数据项(Data Item)
数据项(Data Item)是有独立含义的最小单位。一个数据元素可由一个或多个数据 项组成,此时的数据元素通常称为记录(Record)。 例如:表1.1所示,学生信息表是数据,一行表示一个学生的记录,每一条记录就是一个数据 元素,每一个数据元素都是由学号、姓名、性别、出生日期、政治面貌5个数据项组成。
设计算法
编写代码
数值问题 非数值问题
数学方程式 设计合理的数据结构(表、树、图等)
数据结构是一门研究非数值计算程序设计问题中的操作对象,以及 它们之间的关系和操作等相关问题的学科。
数据结构的3种基本结构---线性结构
线性结构
实例:学生信息管理系统
数据结构的3种基本结构---树结构
树结构
实例:八皇后问题
1.5 算法与性能分析---算法的设计要求
算法的设计要求
1.正确性 程序中不含语法错误、算法的执行结果应当满足预先规定的功能和性能要求。
2.可读性 一个好的算法首先应该便于人们理解和相互交流,其次才是机器可执行。可读 性好的算法有助于人对算法的理解,难懂的算法易于隐藏错误且难于调试和修 改。
3.健壮性 一个好的算法,当输入的数据非法时,也能适当地做出正确反应或进行相应的 处理,而不会产生一些莫名其妙的输出结果。
1.5 算法与性能分析---算法的特性
算法的特性
(1)有穷性:有限步骤之内正常结束,不能形成无穷循环,并且每一步骤在可接 受的时间内完成。这里的有穷的概念并不是纯数学意义的,而是在实际应用当 中合理的、可以接受的“有边界”。
数据元素(Data Element)
数据元素是组成数据的基本单位,是计算机程序加工处理的基本单位,在计算机中通常 作为一个整体进行考虑和处理。
数据项(Data Item)
数据项(Data Item)是有独立含义的最小单位。一个数据元素可由一个或多个数据 项组成,此时的数据元素通常称为记录(Record)。 例如:表1.1所示,学生信息表是数据,一行表示一个学生的记录,每一条记录就是一个数据 元素,每一个数据元素都是由学号、姓名、性别、出生日期、政治面貌5个数据项组成。
设计算法
编写代码
数值问题 非数值问题
数学方程式 设计合理的数据结构(表、树、图等)
数据结构是一门研究非数值计算程序设计问题中的操作对象,以及 它们之间的关系和操作等相关问题的学科。
数据结构的3种基本结构---线性结构
线性结构
实例:学生信息管理系统
数据结构的3种基本结构---树结构
树结构
实例:八皇后问题
1.5 算法与性能分析---算法的设计要求
算法的设计要求
1.正确性 程序中不含语法错误、算法的执行结果应当满足预先规定的功能和性能要求。
2.可读性 一个好的算法首先应该便于人们理解和相互交流,其次才是机器可执行。可读 性好的算法有助于人对算法的理解,难懂的算法易于隐藏错误且难于调试和修 改。
3.健壮性 一个好的算法,当输入的数据非法时,也能适当地做出正确反应或进行相应的 处理,而不会产生一些莫名其妙的输出结果。
1.5 算法与性能分析---算法的特性
算法的特性
(1)有穷性:有限步骤之内正常结束,不能形成无穷循环,并且每一步骤在可接 受的时间内完成。这里的有穷的概念并不是纯数学意义的,而是在实际应用当 中合理的、可以接受的“有边界”。
数据结构说课ppt课件

(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数
基本概念与术语
据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:
1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
单链表
链表操作算法:初始化、插入、输出、删除、遍历
8. 在一个单链表中删除q所指结点时,应执行如下操作:
q=p->next;
p->next=( p->next->next );
free(q);//这种题目靠一根指针是没有办法完成的,必须要借助第二根指针。
9. 在一个单链表中p所指结点之后插入一个s所指结点时,应执行:
(2) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元
问答题
素,这时,应采用哪种存储表示?为什么?
应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。
03
栈和队列
数据结构说课ppt课件
演讲人
数据结构概述
01
线性表
02
栈和队列
03
目录
01
数据结构概述
基本概念与术语
2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。)
在右侧编辑区输入内容
顺序表的存储效率高,存取速度快。此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。
基本概念与术语
据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:
1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
单链表
链表操作算法:初始化、插入、输出、删除、遍历
8. 在一个单链表中删除q所指结点时,应执行如下操作:
q=p->next;
p->next=( p->next->next );
free(q);//这种题目靠一根指针是没有办法完成的,必须要借助第二根指针。
9. 在一个单链表中p所指结点之后插入一个s所指结点时,应执行:
(2) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元
问答题
素,这时,应采用哪种存储表示?为什么?
应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。
03
栈和队列
数据结构说课ppt课件
演讲人
数据结构概述
01
线性表
02
栈和队列
03
目录
01
数据结构概述
基本概念与术语
2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。)
在右侧编辑区输入内容
顺序表的存储效率高,存取速度快。此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。
数据结构全套课件完整版ppt教学教程最新最全

数据类型反映了数据的取值范围以及对这类数据可以施加的运算。例如,在高级程序设计 语言中的整数都具有下列"数学特性":1)它是…-2,-1,0,1,2,…这样一个序列;2)它可以 进行"+"、"-"、" "、"/"及"取模"等运算。
在高级程序设计语言中引入了整型、实型和布尔型等基本数据类型,程序员在编制程序时 就可以将其数据对象建立其上,避免了复杂的机器表示。数据类型就像一层外衣,使得程序员 只需知道如何使用整数、实数和布尔数,而不需要了解机器的内部细节,就能完成相应的程序 设计任务。
第1章
绪论
1.1 数据结构
3.关键码 关键码 (key)指的是数据元素中能起标识作用的数据项,例如学生信息表中的学号和姓 名。其中能起惟一标识作用的关键码称为“主关键码”,如学号;反之称为“次关键码”,如 姓名。
4.数据对象 数据对象(data object)是具有相同性质的数据元素的集合,是数据的一个子集。例如, 整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={'A','B',…, 'Z'}。学生信息管理系统中的学生表也可看成一个数据对象。
新世纪应用型高等教育 计算机类课程规划教材
数据结构
新世纪应用型高等教育教材编审委员会 组编 主编 曹春萍
第2章 线性表
2.1 线性表的基本概念
线性表(linear-list)是一组具有相同特征的数据元素的有限序列。如, 某校十个教学班级的学生人数(50,53,55,52,56,59,60,55,57,51) 构成一个线性表。
第2章 线性表
第1章
在高级程序设计语言中引入了整型、实型和布尔型等基本数据类型,程序员在编制程序时 就可以将其数据对象建立其上,避免了复杂的机器表示。数据类型就像一层外衣,使得程序员 只需知道如何使用整数、实数和布尔数,而不需要了解机器的内部细节,就能完成相应的程序 设计任务。
第1章
绪论
1.1 数据结构
3.关键码 关键码 (key)指的是数据元素中能起标识作用的数据项,例如学生信息表中的学号和姓 名。其中能起惟一标识作用的关键码称为“主关键码”,如学号;反之称为“次关键码”,如 姓名。
4.数据对象 数据对象(data object)是具有相同性质的数据元素的集合,是数据的一个子集。例如, 整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={'A','B',…, 'Z'}。学生信息管理系统中的学生表也可看成一个数据对象。
新世纪应用型高等教育 计算机类课程规划教材
数据结构
新世纪应用型高等教育教材编审委员会 组编 主编 曹春萍
第2章 线性表
2.1 线性表的基本概念
线性表(linear-list)是一组具有相同特征的数据元素的有限序列。如, 某校十个教学班级的学生人数(50,53,55,52,56,59,60,55,57,51) 构成一个线性表。
第2章 线性表
第1章
数据结构 第六章(堆)PPT课件

}
8
插入操作
最大堆的结点个数为n,插入一个新元素时 为了保持完全二叉树性质,新增结点的编号应为 ✓i = n + 1 为了保持最大树性质,还需 ✓要比较结点i和其双亲的key值 ➢如果结点i的key值大于其双亲的key值 ➢将结点i中的元素与其双亲的元素对换 ➢令结点i的双亲成为新的结点i,继续向上 比较 ➢直到结点i的key值不大于其双亲的key值 或i到达根结点为止。
从最大堆中删除一个元素时,该元素必定在?
根结点(结点1)中
为了保持完全二叉树性质 ✓将结点n中的元素暂时存放在结点i = 1中,最大 堆的元素个数变为n – 1。
为了保持最大树性质 ✓比较结点i和其较大子女的key值 ✓若结点i的key值小于其较大子女的key值 ✓将结点i中的元素与其较大子女的元素对换 ✓令结点i的较大子女成为新的结点i,继续向下 比较 ✓直到结点i的key值不小于其较大子女的key值或 i到达叶结点为止
MaxHeap (int sz = DefaultSize ); // 创建空堆 Boolean IsFull ( ); // 判断堆中元素个数是否达到最大容量 void Insert (Element<Type>& item); Boolean IsEmpty ( ); // 判断堆中元素个数是否为0 Element<Type>* Delete(Element<Type>& x ); };
堆
1
优先队列
问题的提出: 日常工作安排 计算机操作系统任务调度
最大优先队列!
性质: 被删除的是优先级最高的元素 任何时刻可插入任意优先级的元素
最小优先队列
2
假设队列有n个元素,最大优先队列的存储结构: • 无序线性表
8
插入操作
最大堆的结点个数为n,插入一个新元素时 为了保持完全二叉树性质,新增结点的编号应为 ✓i = n + 1 为了保持最大树性质,还需 ✓要比较结点i和其双亲的key值 ➢如果结点i的key值大于其双亲的key值 ➢将结点i中的元素与其双亲的元素对换 ➢令结点i的双亲成为新的结点i,继续向上 比较 ➢直到结点i的key值不大于其双亲的key值 或i到达根结点为止。
从最大堆中删除一个元素时,该元素必定在?
根结点(结点1)中
为了保持完全二叉树性质 ✓将结点n中的元素暂时存放在结点i = 1中,最大 堆的元素个数变为n – 1。
为了保持最大树性质 ✓比较结点i和其较大子女的key值 ✓若结点i的key值小于其较大子女的key值 ✓将结点i中的元素与其较大子女的元素对换 ✓令结点i的较大子女成为新的结点i,继续向下 比较 ✓直到结点i的key值不小于其较大子女的key值或 i到达叶结点为止
MaxHeap (int sz = DefaultSize ); // 创建空堆 Boolean IsFull ( ); // 判断堆中元素个数是否达到最大容量 void Insert (Element<Type>& item); Boolean IsEmpty ( ); // 判断堆中元素个数是否为0 Element<Type>* Delete(Element<Type>& x ); };
堆
1
优先队列
问题的提出: 日常工作安排 计算机操作系统任务调度
最大优先队列!
性质: 被删除的是优先级最高的元素 任何时刻可插入任意优先级的元素
最小优先队列
2
假设队列有n个元素,最大优先队列的存储结构: • 无序线性表
数据结构ppt课件完整版

针对有序数据集合,每次通过中间元素将 待查找区间缩小为之前的一半,直到找到 元素或区间为空。
哈希查找
树形查找
通过哈希函数将数据映射到哈希表中,实 现快速查找。
如二叉搜索树、平衡树等,通过树形结构实 现高效查找。
排序算法分类及实现原理
插入排序
将待排序元素逐个插入到已排序序列中,直到所有元素均插入完毕。
由n(n>=0)个具有相同类型 的数据元素(结点)a1,a2,
...,an组成的有序序列。
同一性
每个元素必须是同一类型的数 据。
有序性
元素之间具有一对一的前驱和 后继关系,即除首尾元素外, 每个元素都有一个前驱和一个 后继。
可变性
线性表的长度可变,即可以插 入或删除元素。
顺序存储结构与链式存储结构比较
定义
用一段连续的存储单元依次存储线性 表的数据元素。
优点
可以随机存取表中任一元素,且存取 时间复杂度为O(1)。
顺序存储结构与链式存储结构比较
• 缺点:插入和删除操作需要移动大量元素,时间 复杂度高;需要预先分配存储空间,容易造成空 间浪费。
顺序存储结构与链式存储结构比较
定义
用一组任意的存储单元存储线性 表的数据元素(这组存储单元可 以是连续的,也可以是不连续的
查找操作
查找指定元素的位置。
遍历操作
访问线性表中的每个元素。
销毁操作
释放线性表占用的存储空间。
03
栈和队列
栈定义及特点
栈(Stack)是一种特殊的线性数据结构,其数据的存 取遵循后进先出(LIFO, Last In First Out)的原则。 栈的特点
具有记忆功能,能保存数据的状态。
栈的基本操作包括入栈(push)、出栈(pop)、查 看栈顶元素(top)等。 只能在栈顶进行数据的插入和删除操作。
云大《数据结构》课程教学课件-第6章 树和二叉树(147P)_OK

^d ^ ^ e ^ 三叉链表
3)二叉链表是二叉树最常用的存储结构。还有其它链接方 法,采用何种方法,主要取决于所要实施的各种运算频度。
例:若经常要在二叉树中寻找某结点的双亲时,可在每个结 点上再加一个指向其双亲的指针域parent,称为三叉链表。
lchild data parent rchild
2021/8/16
2021/8/16
9
6.2 二 叉 树
6.2.1 二叉树的概念
一、二叉树的定义: 二叉树(Binary Tree)是n(n>=0)个结点的有限集,它或者是 空集(n=0)或者由一个根结点和两棵互不相交的,分别称 为根的左子树和右子树的二叉树组成。 可以看出,二叉树的定义和树的定义一样,均为递归定 义。
A
集合3
集合1
BCD
EF
G
集合2
2021/8/16
3
2、树的表示方法 1)树形图法
A
BCD
EF
G
2)嵌套集合法
3)广义表形式 ( A(B, C(E,F), D(G) )
4)凹入表示法
2021/8/16
A B
D
CG
EF
A B C E DF G
4
3、 树结构的基本术语
1)结点的度(Degree):为该结点的子树的个数。 2)树的度:为该树中结点的最大度数。
7)路径(Path):若树中存在一个结点序列k1,k2,…,kj,使得ki是 ki+1的双亲(1<=i<j),则称该结点序列是从ki到kj一条路径 (Path)
路径长度:路径的长度为j-1,其为该路径所经过的边的数 目。
A
BCD
EF
G
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n++;
for (int i = n; i > 1;) { // i==1表示已到达根结点
if (x.key <= heap[i/2].key) // 新元素的关键字不大
break;
// 于结点i双亲元素的关键字
heap[i] = heap[i/2]; // 将双亲结点的元素移到结点i中
i/=2;
// i继续向上
2020/12/10
9
前述插入过程如下所示:
2020/12/10
10
函数Insert实现了最大堆插入操作:
template <class Type>
void MaxHeap<Type>::Insert ( const Element<Type>&x ) {
// 将元素x 插入最大堆
if (n == MaxSize ) { HeapFull( ); return;}
DeleteMax(Element<Type>&x) {// 从最大堆中删除元素
if (!n) { HeapEmpty( ); return 0;}
x = heap[1]; Element<Type> k = heap[n]; n--;
for (int i = 1, j = 2; j <= n;) { // j是i的子女
• 链表结构,插入操作可在表的前端完成,其时 间为O(1)。删除操作的时间仍然为O(n)。
• 有序线性表
• 元素按优先级非递增次序排列,每次删除操作 的时间为O(1),但每次插入操作的时间为O(n)。
2020/12/10
3
有没有其他更好的方式?
树!
为什么?
O(logm n)
定义:最大树是一棵树,其中每个结点的key值不 小于该结点子女(如果存在的话)的key值
MaxHeap (int sz = DefaultSize ); // 创建空堆 Boolean IsFull ( ); // 判断堆中元素个数是否达到最大容量 void Insert (Element<Type>& item); Boolean IsEmpty ( ); // 判断堆中元素个数是否为0 Element<Type>* Delete(Element<Type>& x ); };
}
heap[i] = x;
}
2020/12/10
11
分析:
插入过程从完全二叉树的叶结点开始,并向上移 动,最坏情况下到根为止 在此路径上每一个结点的处理时间是O(1) n个结点的完全二叉树的高度为log2(n+1) 插入函数的for循环最多迭代O(log n)次
插入函数的时间复杂性是O(log n)
}
2020/12/10
15
PPT教学课件
谢谢观看
Thank You For Watching
2020/12/10
最大堆既是一棵完全二叉树,又是一棵最大树
2020/12/10
4
最大堆的例子:
2020/12/10
5
最大堆的基本操作: (1) 创建空堆 (2) 将新元素插入堆中 (3) 从堆中删除key值最大的元素
2020/12/10
6
最大堆的ADT定义如下:
template <class Type> class MaxHeap: public MaxPQ <Type> { // 对象:由n≥0个元素构成的完全二叉树和最大树 public:
✓令结点i的较大子女成为新的结点i,继续向下
比较
✓直到结点i的key值不小于其较大子女的key值或
i到达叶结点为止
2020/12/10
13
除过程如下所示:
2020/12/10
14
最大堆删除操作:
template <class Type>
Element<Type>* MaxHeap<Type>::
2020/12/10
7
由于最大堆是一棵完全二叉树,所以可用数组 heap表示:
private:
Element<Type> *heap;
int n;
// 最大堆的当前元素个数
int MaxSize;
// 堆中可容纳元素的最大个数
MaxHeap的构造函数如程序如下:
MaxHeap::MaxHeap (int sz = DefaultSize ) { MaxSize = sz; n = 0; heap = new Element<Type>[MaxSize+1]; // heap[0] 不用
}
2020/12/10
8
插入操作
最大堆的结点个数为n,插入一个新元素时 为了保持完全二叉树性质,新增结点的编号应为 ✓i = n + 1 为了保持最大树性质,还需 ✓要比较结点i和其双亲的key值 ➢如果结点i的key值大于其双亲的key值 ➢将结点i中的元素与其双亲的元素对换 ➢令结点i的双亲成为新的结点i,继续向上 比较 ➢直到结点i的key值不大于其双亲的key值 或i到达根结点为止。
if (j < n) if (heap[j].key < heap[j+1].key)
j++;
if (k.key >= heap[j].key)
break;
heap[i] = heap[j]; // 将较大子女的元素移到结点i中
i = j; j *= 2;
// i继续向下
}
heap[i] = k;
return &x;
2020/12/10
12
删除操作
从最大堆中删除一个元素时,该元素必定在?
根结点(结点1)中
为了保持完全二叉树性质
✓将结点n中的元素暂时存放在结点i = 1中,最大
堆的元素个数变为n – 1。
为了保持最大树性质
✓比较结点i和其较大子女的key值
✓若结点i的key值小于其较大子女的key值
✓将结点i中的元素与其较大子女的元素对换
堆
2020/12/10
1
优先队列
问题的提出: 日常工作安排 计算机操作系统任务调度
最大优先队列!
性质:
被删除的是优先级最高的元素
任何时刻可插入任意优先级的元素
最小优先队列
2020/12/10
2
假设队列有n个元素,最大优先队列的存储结构:
• 无序线性表
• 顺序映射,插入操作很容易在表的尾端完成, 其时间为O(1)。删除操作需要查找优先级最高 的元素并删除之,需要O(n)时间