湘潭大学 数据结构 课件 ppt Ch06 Priority Queues(Heaps)

合集下载

《数据结构栈和队列》课件

《数据结构栈和队列》课件
在操作系统中,任务按照 优先级顺序进入队列,系 统按照队列的先进先出原 则进行任务调度。
网络通信
在网络通信中,数据包按 照到达顺序进入队列,等 待处理。
打印任务管理
打印任务按照到达顺序进 入队列,等待打印机的空 闲时间进行处理。
05
栈与队列的比较
结构比较
栈和队列是两种不同的数据结构,它们在结构上有明显的区 别。
课程目标
掌握栈和队列的基本 概念、原理和应用场 景;
能够运用栈和队列解 决实际问题和算法设 计。
理解栈和队列在解决 实际问题中的作用和 优势;
02
数据结构概述
数据结构定义
数据结构定义
数据结构是数据元素之间相互关系和数据元素属性的 抽象表示。
数据结构组成
数据元素、数据元素之间的关系和数据元素的属性。
表达式求值:例如,括号内的运算优先级高于括号外的运算,可以使用栈来保存括 号和运算符,以便正确地计算表达式的值。
深度优先搜索(DFS):在图的遍历中,可以使用栈来保存待访问的节点,实现深 度优先搜索。
04
队列(Queue)
队列的定义
01
队列是一种先进先出(FIFO)的数据结构,用于存储元素的集 合。
07
总结与展望
本章总结
栈和队列是两种常见的数据结构,具有特定的操作规则和特性。
通过学习栈和队列,我们掌握了先进先出(FIFO)和后进先出(LIFO)的 原理,以及如何在程序中实现这些数据结构。
本章还介绍了栈和队列在实际问题中的应用,如括号匹配、表达式求值等 。
数据结构的发展趋势与未来展望
01
随着计算机技术的不断发展,数据结构也在不断演进
02
队列中的元素遵循先入队后出队的规则,即最早进入队列的元

数据结构3栈和队列PPT教学课件

数据结构3栈和队列PPT教学课件

~AStack() { delete [] elements; } // Destructor
void clear() { top = 0; }
注意:这里top在第I个位置
2020/12/12
8
一些重要的条件
栈满:top==maxSize-1; 栈空:top==-1
2020/12/12
9
链式栈
{
private:
int MaxSize;
// 栈中最大元素个数
int top;
// 栈中实际元素个数
T *elements; // 存储栈元素的数组
public:
AStack(int sz =DefaultListSize) // Constructor
{ size = sz; top = 0; elements = new T[sz]; }
virtual void MakeEmpty() = 0; virtual int isEmpty() virtual int isFull()=0
};
2020/12/12
5
顺序栈
由于栈是运算受限的线性表,因此 线性表的存储结构对栈也适应。
栈的顺序存储结构简称为顺序栈, 它是运算受限的线性表。因此,可用 数组来实现顺序栈。因为栈底位置是 固定不变的,所以可以将栈底位置设 置在数组的两端的任何一个端点;栈 顶位置是随着进栈和退栈操作而变化 的,故需用一个整型变量top
时间上:顺序栈为O(1),链式栈为O(1) 空间上:顺序栈要一个固定的长度,当栈不够
满时,空间浪费;链式栈长度可变,但对于每 个元素需要一个链接域,产生结构性开销。 何时使用顺序栈? 当要实现多个栈时,可用一个数组存储两个栈, 且最好是一个栈增长时另一个栈缩短。

数据结构Queues队列

数据结构Queues队列
闲时间进行处理。
网络通信
在网络通信中,队列用于存储待处理 的网络数据包,以便按照顺序进行处 理。
银行排队系统
银行排队系统中,客户按照到达顺序 进入队列等待办理业务。
02
队列的基本操作
入队操作
01 入队(Enqueue)
将一个元素添加到队列的末尾。
02 时间复杂度
在大多数实现中,入队操作的时间复杂度为O(1), 因为通常可以在常数时间内将元素添加到队列的 末尾。
详细描述
循环队列是一种改进的数组实现方式,通过使用两个指针分别指向队列头部和尾部,以及一个表示队 列总容量的变量来实现。当队列为空时,头部和尾部指针都指向队列的起始位置;当队列满时,头部
和尾部指针都指向队列的结束位置。循环队列通过循环利用数组空间来避免数组空间的浪费。
队列的常见操作时间复杂度
04
分析
总结与展望
队列的重要性和应用价值
01 队列是一种先进先出(FIFO)的数据结构,广泛 应用于计算机科学和信息技术领域。
02 队列在操作系统、网络通信、数据库管理、图形 渲染等方面具有重要作用,能够高效地处理任务 调度、缓冲区管理、事件驱动等场景。
02 队列在算法设计和数据结构领域中也是重要的基 础组件,对于提高程序性能和解决复杂问题具有 关键作用。
出队操作的时间复杂度
总结词
出队操作的时间复杂度也取决于队列 的实现方式和底层数据结构。
详细描述
在链表实现的队列中,出队操作通常需要O(1) 的时间复杂度,因为只需访问链表的头部元素。 而在数组实现的队列中,出队操作可能需要 O(n)的时间复杂度,因为可能需要移动数组中 的所有元素来填补被移除的元素的空间。
详细描述
链表实现队列时,通常使用两个指针分别指向队列头部和尾部。入队操作在尾部进行,出队操作在头 部进行。当队列为空时,头部和尾部指针都指向队列的起始位置;当队列满时,头部和尾部指针都指 向队列的结束位置。由于链表的大小是动态的,因此队列的大小也是动态的。

《栈和队列》课件

《栈和队列》课件

栈与队列的区别
数据存储方式
栈是后进先出(Last In First Out, LIFO)的数据结构,新元素总是被添加到栈顶,移除 元素时也是从栈顶开始。而队列是先进先出(First In First Out, FIFO)的数据结构,新 元素被添加到队列的尾部,移除元素时从队列的头部开始。
操作方式
栈的主要操作有push(添加元素)和pop(移除元素),而队列的主要操作有enqueue (添加元素)和dequeue(移除元素)。
《栈和队列》ppt课件
目录
CONTENTS
• 栈的定义与特性 • 队列的定义与特性 • 栈与队列的区别与联系 • 栈和队列的实现方式 • 栈和队列的算法实现 • 总结与思考
01 栈的定义与特性
CHAPTER
栈的定义
栈是一种特殊的线性 数据结构,遵循后进 先出(LIFO)原则。
栈中的元素按照后进 先出的顺序排列,最 新加入的元素总是位 于栈顶。
02
如何实现一个队列,并 实现其基本操作( enqueue、dequeue、 front)?
03
栈和队列在应用上有哪 些区别?请举例说明。
04
请设计一个算法,使用 栈实现括号匹配的功能 ,并给出测试用例。
谢谢
THANKS

队列的应用场景
任务调度
在任务调度中,可以将任 务按照优先级放入队列中 ,按照先进先出的原则进 行调度。
网络通信
在网络通信中,可以将数 据包放入队列中,按照先 进先出的原则进行发送和 接收。
事件处理
在事件处理中,可以将事 件放入队列中,按照先进 先出的原则进行处理。
03 栈与队列的区别与联系
CHAPTER
应用场景

数据结构课件第3篇章栈和队列

数据结构课件第3篇章栈和队列

循环队列实现原理
01
循环队列定义
将一维数组看作首尾相接的环形结构,通过两个指针(队头和队尾指针)
在数组中循环移动来实现队列的操作。当队尾指针到达数组末端时,再
回到数组起始位置,形成循环。
02
判空与判满条件
在循环队列中,设置一个标志位来区分队列为空还是已满。当队头指针
等于队尾指针时,认为队列为空;当队尾指针加1等于队头指针时,认
栈在函数调用中应用
函数调用栈
在程序执行过程中,每当发生函数调用时,系统会将当前函数的执行上下文压入一个专门的栈中,称为函数调用 栈。该栈用于保存函数的局部变量、返回地址等信息。当函数执行完毕后,系统会从函数调用栈中弹出相应的执 行上下文,并恢复上一个函数的执行状态。
递归调用实现
递归调用是一种特殊的函数调用方式,它通过在函数调用栈中反复压入和弹出同一函数的执行上下文来实现对问 题的分解和求解。在递归调用过程中,系统会根据递归深度动态地分配和管理函数调用栈的空间资源。
栈和队列的应用
栈和队列在计算机科学中有着广泛的应用,如函数调用栈、表达式求 值、缓冲区管理等。
常见误区澄清说明
误区一
栈和队列的混淆。虽然栈和队列都是线性数据结构,但它们的操作方式和应用场景是不同的。栈是后进先出,而队列 是先进先出。
误区二
认为栈和队列只能通过数组实现。实际上,栈和队列可以通过多种数据结构实现,如链表、循环数组等。具体实现方 式取决于应用场景和需求。
后缀表达式求值
利用栈可以方便地实现后缀表达式的求值。具体步骤 为:从左到右扫描表达式,遇到数字则入栈,遇到运 算符则从栈中弹出所需的操作数进行计算,并将结果 入栈,最终栈中剩下的元素即为表达式的结果。
中缀表达式转换为后缀表达式

数据结构课件第3篇章队列

数据结构课件第3篇章队列

PART 01
队列基本概念与特性
队列定义及操作规则
队列(Queue)是一种具有先进先出(FIFO)特性的线性表,只允许在一端(队尾) 插入元素,而在另一端(队头)删除元素。
队列中没有元素时,称为空队列。
队列的基本操作包括:入队(在队尾插入一个元素)、出队(删除队头元素)、判 空(判断队列是否为空)、查看队头元素等。
队列与栈的区别与联系
01
区别
02
队列遵循先进先出(FIFO)原则,而栈遵循后进先出 (LIFO)原则。
03
队列只允许在一端插入元素,在另一端删除元素;而栈只 允许在一端进行插入和删除操作。
04
联系
05
队列和栈都是线性结构,数据元素之间存在一对一的线性 关系。
06
它们都可以用来存储具有相同数据类型的数据元素,且元 素的插入和删除操作都受到一定限制。
LRU缓存淘汰算法
在实现LRU(Least Recently Used)缓存淘汰算法 时,可以使用双端队列来维护缓存中的元素。通过 双端队列的插入和删除操作,可以高效地实现缓存 的更新和淘汰。
其他应用
除了上述应用外,双端队列还可以应用于其他场 景,如实现回文检查、处理字符串反转等问题。
PART 06
取出一个进程进行处理。
03
网络通信
在网络通信中,数据的传输往往采用队列的方式进行。发送方将数据放
入发送队列中,接收方从接收队列中取出数据进行处理。这种方式可以
保证数据的顺序性和可靠性。
PART 02
顺序队列实现原理及方法
顺序队列存储结构介绍
பைடு நூலகம்
存储结构定义
顺序队列是采用一维数组作为存储 结构,遵循队列先进先出(FIFO) 的原则进行数据的存取。

数据结构6 队列

数据结构6 队列

链式队列的实现
java语言描述:
循环链式队列的讨论
public class SingleLinkedQueue<AnyType> { private Node<AnyType> front,back; //队头、队尾 private int currentSize;
public SingleLinkedQueue() {front=back=null; currentSize=0; }
(a) 1), a2),a3,)…)an-1),an) 出队过程
(…a) 213n,-)a1…a,na32-1na,a…,)na3-1n,a…,)ann-1a),na-n1), an)
a1 a2 a3 …… an-1 an 队的特点:先进先出(First In First Out)
队列的数组实现
队列的逻辑形态 0 1 2 34 5
银行业务的抽象
服务柜台
角色和过程
顾客
何时来到银行?
需要多长的办理时间?
事件
顾客到来
顾客离开
加入最短的队列 下一个顾客得到服务
Байду номын сангаас 小结
队列的基本概念 链式队列 顺序队列 队列应用
特殊的线性表 先进先出 主要的操作:入队、出队
带头结点的单链表
入队、出队等操作的实现 循环队列解决假溢出 队空和队满的判定 入队、出队、长度的表达式 如何实现的循环?
a1 a2 a3
front
back
每一个队列的数据结构,用一个数组theArray以及 位置front和back来表示,同时还需记录实际存于队 列中的元素的个数currentSize。
队列的数组实现

《数据结构课件队列》PPT课件

《数据结构课件队列》PPT课件

front
J6 J5 4 5 0 J7
31 J4 2 J8
rear
精选PPT
11
队空:front==rear 队满:front==rear
J6
J5 5
4
0
J4
3
1 2
rear
5
4
0
3
1
2
front rear
front
J5 初始状态
J4
解决方案: 1.另外设一个标志以区别队空、队满
front
2.少用一个元素空间:
(a0, a1, ... , ai -1, ai , ai+1, …, an-1 )
删除
精选PPT
插入
2
a a a a front
rear
0 1 2 …… n-1




队列的示意图
队列的特点 先进先出
说明:
第一个入队的元素在队头, 最后一个入队的元素在队尾, 第一个出队的元素为队头元素, 最后一个出队的元素为队尾元素
4.取队头元素 GetHead(Q,&e)
得到队列Q的队头元素之值,并用e返回其值。
5.判队空 QueueEmpty(Q)
判断队列Q是否为空,若为精选空PP返T 回1,否则返回0。
4
3.4.2 非循环队列和循环队列
分配一块连续的存储区域来存放队列里的元素。由 于队列的队头和队尾的位置是变化的,因而要设两个 指针和分别指示队头和队尾元素在队列中的位置。
为充分利用向量空间,克服上述假上溢现象,可以
将向量空间想象为一个首尾相接的圆环,并称这种
向量为循环向量,存储在其中的队列称为循环队列

Ch5.1-5 Priority Queues

Ch5.1-5 Priority Queues
2/15
§2 Simple Implementations
Binary Search Tree :
right, Hey you are getting smarter! then we must always There are many Oh,bet you have good wrong? operations Ah! That’s what’s idea! no… a a better option? I as Oh the left subtrees…. Yes to AVL treeto know from☺ tree such don’t Well,a balanced treerandom,AVLreally relatedinsertions are deleteinsertion and deletion will take Now you begin that we me Both But is deletions ideaNOT. hey, what but not a bad arepriority queue. if we keep need for a since only a N) only. O(log a are constantBesides, pointers balanced tree? factor will be added to We are supposed to delete Thethe run time. dangerous. minimum element only. always However…
1/15
§2 Simple Implementations
Array : Insertion — add one item at the end ~ Θ ( 1 ) Deletion — find the largest \ smallest key ~ Θ ( n ) remove the item and shift array ~ O( n ) Linked List : Insertion — add to the front of the chain ~ Θ ( 1 ) Deletion — find the largest \ smallest key ~ Θ ( n ) remove the item ~ Θ( 1 ) Ordered Array : Insertion — find the proper position ~ O( n ) shift array and add Better since there arethe item ~ O( n ) never Deletion — remove the first \ last item ~ Θ( 1 )

牛小飞《数据结构》6优先队列PPT课件

牛小飞《数据结构》6优先队列PPT课件

查找元素算法
总结词
有序性利用
详细描述
查找元素算法需要利用队列的有序性。 由于队列中的元素按照优先级顺序排 列,因此可以通过二分查找等算法快 速定位具有特定优先级的元素的位置。
查找元素算法
总结词
返回位置信息
详细描述
查找元素算法不仅需要返回查找到的元素本 身,还需要返回该元素在队列中的位置信息。 这有助于用户更好地了解元素在队列中的位 置和优先级情况。
THANKS FOR WATCHING
感谢您的观看
特点
优先队列中的元素可以按照优先 级的高低进行排序,优先级高的 元素具有更高的出队优先权。
优先队列的应用场景
任务调度
在任务调度中,可以按照任务的优先级进行排序, 优先级高的任务先被执行。
路由协议
在路由协议中,数据包可以根据优先级的高低进 行转发,优先级高的数据包先被转发。
操作系统
在操作系统中,进程可以根据优先级的高低进行 调度,优先级高的进程先被执行。
分段链表
将队列元素分成多个段,每个段内部使用链表结构,以减少插入和 删除操作的时间复杂度。
06 优先队列的案例分析
基于数组实现的优先队列案例
总结词:简单易懂
详细描述:基于数组实现的优先队列是最直 观和简单的实现方式。通过数组的索引访问 元素,可以快速地找到最小(或最大)元素 并进行出队操作。但需要注意的是,当元素 数量变化时,需要重新调整数组的大小,这
基于二叉堆实现的优先队列案例
总结词:平衡高效
描述:基于二叉堆实现的优先队列是一种平衡树结构, 具有高效的插入、删除和查找最小(或最大)元素的操 作。二叉堆中的每个节点都大于(或小于)其子节点, 根节点是最小(或最大)元素。通过调整节点顺序,可 以快速地实现出队操作。二叉堆在实现优先队列时具有 较好的时间和空间复杂度,是一种高效的数据结构。

数据结构--栈和队列 ppt课件

数据结构--栈和队列  ppt课件

ppt课件
7
2 、说明:设(a1, a2, a3, …, an ) 是一个栈
1)表尾称为栈顶,表头称为栈底 ,即a1为栈底元素,an为栈顶元素;
2)在表尾插入元素的 操作称进栈操作,在表头删除元素的操作称为 出栈操作;
3)元素按a1, a2, a3, …, an 的次序进栈, 第一个进栈的元素一定在 栈底,最后一个进栈的元素一定在栈顶, 第一个出栈的元素为栈顶元素;
…….
} ADT Stack
ppt课件
13
二 栈的存储表示和操作的实现
和线性表类似,栈也有两种存储表示,其顺 序存储结构简称为顺序栈。
和顺序表类似,对顺序栈也需要事先为它分 配一个可以容纳最多元素的存储空间。
ppt课件
14
顺序存储方式:同一般线性表的顺序存储结构 完全相同。是利用一组连续的内存单元依次存放 自栈底到栈顶的数据元素,栈顶元素的位置由一 个称为栈顶指针的变量指示 。
ppt课件
17
特点:简单、方便,但易产生溢出。 上溢(Overflow ) 栈已经满,又要压入元素; 下溢(Underflow ) 栈已经空,还要弹出元素;
注:上溢是一种错误,使问题的处理无法进行下去; 而下溢一般认为是一种结束条件,即问题处理结束。
ppt课件
18
顺序栈的存储表示
#define STACK_INIT_SIZE 100//栈存储空间的初始分配量
的特点(Last In First out-LIFO First In Last
out ---FILO )
ppt课件
9
课堂练习
假设有A , B , C , D 四个元素;它们入栈次 序为A一> B 一>C 一>D 出栈次序任意, 请问不可能得到下面哪些出栈序列?

数据结构之栈和队列PPT课件

数据结构之栈和队列PPT课件
LOGO




华 山

图4.1 华山道路的一段
LOGO
第二节
❖ 2.栈的相关概述 ❖ 掌握栈的定义及相关概念,熟悉栈的操作顺序及
元素进出栈的顺 栈的定义 ❖ 栈是一种特殊的线性表,其全部操作都被限制在
表的固定一端进行,而且构成栈的元素必须是同 一数据类型。 ❖ 例如,对于【例4.1】,假设有10名游客组成的一 个旅游团,其上山的顺序为游客1、游客2、游客 3、……、游客10,由于某种原因,这10位游客 不想上山了,其下山顺序为游客10、……、游客 3、游客2、游客1,如图4.2所示,该过程和数据 结构中栈的操作一致,其入栈对应上山顺序,其 出栈对应下山顺序,满足“后进先出”的顺序。
栈顶
an
a2
栈底
a1
... ……...
出栈 栈s=(a1,a2,……,an) LOGO
问题1:堆栈是什么?它与一般线性表有什么
不堆同栈?是一种特殊的线性表,它只能在表的一端(即
栈顶)进行插入和删除运算。
一般线性表 逻辑结构:1:1 存储结构:顺序表、链表 运算规则:随机存取
堆栈 逻辑结构: 1:1 存储结构:顺序栈、链栈 运算规则:后进先出LIFO
思考:有无通用的判别原则?
LOGO
❖例3:设依次进入一个栈的元素序列为c,a,b,d,
❖ 则可得到出栈的元素序列是:
❖A)a,b,c,d
B)c,d,a,b
❖C)b,c,d,a
D)a,c,d,b
答: A)、D)可以, B)、C)不行。
讨论:有无通用的判别原则?
有!若输入序列 …,Pj…Pk…Pi …(Pj<Pk<Pi), 一定不存在这样的输出序列 …,Pi…Pj…Pk …

优先队列及其应用PPT演示文稿

优先队列及其应用PPT演示文稿
up(n) end;
PROC del(x:longint); {删除一个值为x的元素} begin
a[n]:=a[x]; down(x) end;
d-堆
• 多叉堆 • 优先队列无法全部装入内存 • 在实际应用中,4-堆可胜过二叉堆
左高树(或左偏树)
高度与宽度优先的最大及最小左高树 • 堆——隐式(implicit)数据结构
优先队列的基本概念
队列:FIFO(按元素进入队列的次序); 优先队列(Priority Queue):出队列的顺序由元
素的优先级决定,如: • 医院中的急诊处理; • 操作系统中使用优先队列进行作业调度; • 事件驱动模拟处理。
优先队列的基本操作
ADT MaxPriorityQueue { 实例
数的一般,则称p是重节点,否则称为轻节点 • 位势的选取:右路径上重节点的数目
斜堆的摊还分析
证明: 令H1和H2为两个斜堆,节点数为N1和N2,右路径上轻重节点数目
分别为l1和h1、 l2和h2 若合并代价定义为右路径上节点总数,则代价为l1+h1+l2+h2 合并操作的重要特性:右路径上的重节点肯定变为轻节点;而轻节
左高树定义
• 定义[高度优先左高树]: 当且仅当一棵二叉树的任一内部节点, 其左孩子的s 值大于等于右孩子的s 值, 该二叉树为高度优先左高树(heightbiased leftist tree, HBLT)
定理
• 定理: 令x为一个HBLT的内部节点,则
以x为根的子树的节点数目至少为2s(x)-1。 若子树x有m个节点,s(x)最多为log2(m+1)。 通过最右路径(即,此路径是从x开始沿右孩
• 对集合中的树,按照根节点的值从小到大排序。 • 从右到左,不断地合并最后两个子树,直到只剩下一棵树。 • 合并方法是: • 如果倒数第二棵树有左子树,那么把左子树变为右子树。 • 把最后一棵树作为倒数第二棵树的左子树。

第02章基本数据结构PriorityQueuesHeapsDictionariesHashTables-精品

第02章基本数据结构PriorityQueuesHeapsDictionariesHashTables-精品
Performance:
insertItem takes O(1) time since we can insert the item at the beginning or end of the sequence
removeMin, minKey and minElement take O(n) time since we have to traverse the entire sequence to find the smallest key
1. Inserting the elements into the priority queue with n insertItem operations takes time proportional to
1 + 2 + …+ n
2. Removing the elements in sorted order from the priority queue with a series of n removeMin operations takes O(n) time
Two distinct items in a priority queue can have the same key
Mathematical concept of total order relation
Reflexive property: x x
Antisymmetric property: xy yx x=y
A generic priority queue uses an auxiliary comparator
The comparator is external to the keys being compared
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

~ O( n ) ~ ( 1 ) ~ ( 1 )
二叉查找树:
§2 简单的实现
哦 , ! 呃哦 … 还不行吗 ? 你越来越聪明啦! 我想你是不是又有更好的想法了 ? 好 !, 对呀 好注意 其实 ……AVL 的许多操作 现在你开始懂 我了 我们总是从左子树删除 …. 像 AVL 树这种平衡二叉树并不一定是 可是要注意 ----插入是随机的, 插入和删除都只需要 对优先队列而言并不是必须的 . 而我们还必须保持树的平衡 …… 个坏主意,因为我们只需要增加常数的 O(log N) . 而删除不是。 而且, 运行时间。可是 … . 我们总是假定删除最大的元素 指针操作总带有某些潜在的危险
【定义】 “优先队列” (Priority Queue)是特殊的“队列”,从堆中 取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入 队列的先后顺序。采用完全二叉树存储的优先队列 称为堆(Heap)。
§2 简单的实现
数组 :
Insertion — 元素插入在末尾 Deletion — 查找最大(或最小)关键字 从数组中删除需要移动元素 链表: Insertion —元素总是插入链表的头部 Deletion —查找最大(或最小)关键字 删去结点 有序数组: ~ (1) ~ (n) ~ O( n ) ~ (1) ~ (n) ~ ( 1 )
情形 3 : new_item = 9
20 > 9
10 > 9
§3 二叉堆
/* H->Element[ 0 ] is a sentinel */ void Insert( ElementType X, PriorityQueue H ) { int i;
H->Element[ 0 ] 是一个 上滤 哨兵 ,即比堆中最小的值 if ( IsFull( H ) ) { Percolate up 还要小。 Error( "Priority queue is full" );
§3 二叉堆
PriorityQueue Initialize( int MaxElements ) { PriorityQueue H; if ( MaxElements < MinPQSize ) return Error( "Priority queue size is too small" ); H = malloc( sizeof ( struct HeapStruct ) ); if ( H ==NULL ) return FatalError( "Out of space!!!" ); /* Allocate the array plus one extra for sentinel */ H->Elements = malloc(( MaxElements + 1 ) * sizeof( ElementType )); if ( H->Elements == NULL ) return FatalError( "Out of space!!!" ); H->Capacity = MaxElements; H->Size = 0; H->Elements[ 0 ] = MinData; /* set the sentinel */ return H; }
Review
队列
先进先出 设想:
发送到打印机的文档放到队列中,如果希望先打印 重要的或短的文档? 操作系统调度程序使用队列,重要的或短的作业能 优先吗?
第六章 优先队列(堆)
—— 删除具有最高 / 最低优先级的元素
§1 ADT 模型
数据对象集: 一个有限的有序表,包含零个或多个元素。
数据操作集:
§3 二叉堆
DeleteMБайду номын сангаасn
算法梗概: 啊哈! 这很简单 -我们只要删除根结点 ... move 18 up to the root [1] 10 18 12 只能删除这个结点 并重新安排剩下的树结点, [3] 20 12 15 18 使之仍是最小树。 以保证树仍是完全二叉树 find the smaller child of 18 12 < 18
§3 二叉堆
【定理】对高度为 h ,包含 2h+1 1 个结点的满二叉树,结 点高度之和为 2h+1 1 (h + 1). T(N)=O(N)
§4 优先队列的应用
〖例1〗选择问题:已知一个有N个元素的表,给定一个整 数k,找到表中第k大的元素。
你能想到几种方法来解决这个问题? 它们各自的时间复杂度是多少?
§3 二叉堆
1. 结构性质: 【定义】一棵具有 n 个结点,高度为 h 的二叉树是完全二 叉树,当且仅当它的结点编号与高度为 h 的满二叉树结点 编号能一一对应。 一棵高度为 h 的完全二叉树结点数为 2h 至 2h+1 1 个。 h = log N
1
数组实现: BT [ n + 1 ] ( BT [ 0 ] 未使用)
那太。。。慢了! N successive Insertions ?
BuildHeap ( H )
将 N 个关键字以任意顺序放到一个空堆H中。
150, 80, 40, 30, 10, 70, 110, 100, 20, 90, 60, 50, 120, 140, 130 sys. admin.
150 10 150 80 10 20 150 20 30 10 80 60 70 50 40 110
2 3 4
B D A
5 10
F
6 BT 11 12
G C
0
71
A
2 B 9 I
3 C
4 D
5 E
6 F
8
E
9
13 14
7 G
8 H
15
10 11 12 13 J
H
I
J
§3 二叉堆
【引理】如果一棵具有 n 个结点的完全二叉树是顺序实现 的,那么对任意位置编号 i 的结点, 1 i n,有:
i 2 i f i 1 (1) i n de xof parent( i ) Non e i f i 1 i f 2i n 2i (2) i n de xof left _ child ( i ) Non e i f 2i n 2i 1 i f 2i 1 n (3) i n de xof right _ child ( i ) Non e i f 2i 1 n
Percolate down
将堆 H 中位置 P 处的结点关键字增加 …… 将过度消耗CPU时间的进程降低优先级。
sys. admin.
§3 二叉堆
Delete ( P, H )
DecreaseKey(P, , H); DeleteMin(H)
sys. admin.
将堆 H 中位置 P 处的结点删除…… 当一个进 程由用户中止(非正常终止)时,它必须从优 先队列中除去。
[2]
15 18
[4]
18
[5]
15 < 18
T (N) = O ( log N )
§3 二叉堆 ElementType DeleteMin( PriorityQueue H ) { 通过添加另一个 省略这个条件, int i, Child; 下滤 哨兵,能否去掉 会发生什么? ElementType MinElement, LastElement; 这个测试 ? if ( IsEmpty( H ) ) { Percolate down Error( "Priority queue is empty" ); return H->Elements[ 0 ]; } MinElement = H->Elements[ 1 ]; /* save the min element */ LastElement = H->Elements[ H->Size-- ]; /* take last and reset size */ for ( i = 1; i * 2 <= H->Size; i = Child ) { /* Find smaller child */ Child = i * 2; if (Child != H->Size && H->Elements[Child+1] < H->Elements[Child]) Child++; if ( LastElement > H->Elements[ Child ] ) /* Percolate one level */ H->Elements[ i ] = H->Elements[ Child ]; else break; /* find the proper position */ } H->Elements[ i ] = LastElement; return MinElement; }
4. 其他的堆操作:
§3 二叉堆
Note: 查找除最小元外的任何元素都需对整个堆进行线 性搜索。
DecreaseKey ( P, , H )
Percolate up
将堆 H 中位置 P 处的结点关键字减小 …… 因此我的程序可以以更高优先级运行 .
sys. admin.
IncreaseKey ( P, , H )
Insertion — 找到合适的位置 ~ O( n )或O(logn) 由于 Deletion的次数从不多余 移动元素并插入 ~ O( n ) Insertion 的次数,链表可能是 Deletion — 删去最后一个元素 ~ ( 1 )
有序链表:
相关文档
最新文档