当前课程知识点:数据结构(下) > 第十章 优先级队列 > (a1)需求与动机 > 10a1-1: 应用需求
同学们好,从今天开始,我们将进入第10章,优先级队列。
我们将会看到,这是一类非常有趣的数据结构。
顾名思义,在逻辑上,它们首先是队列。
然而与常规的队列不同,其中的元素接受访问的次序未必是先进先出,
而是按照所谓的“优先级”进行访问。
以下,就首先让我们来通过几个具体的应用实例,
体会设计和实现这种数据结构的用意所在。
我们的第一个应用场景是夜间门诊。
假设某家医院在夜间只安排了一位医生值班,
那么他将按照什么样的次序为到来的病人提供服务呢?
如果只是一般的感冒发烧、头痛脑热,那么自然是采用先来先服务的次序。
然而真实的场景要复杂得多。
比如,倘若某位病人是发生了骨折,
那么相对于一般的病人,他更应该优先地接受处置和治疗——
即便他是刚刚才到。
而即便是在这位骨折病人接受处置的过程中,
如果又有一位心脏病突发的病人到来,
那么相对而言,骨折就显得不那么重要了。
是的,在这样的场景下,每一位医生都会将包括骨折病人在内的所有病人放在一边,
而去优先治疗这位刚刚到来的心脏病患者。
可以看到,在这一场景中,此前的先到先服务的原则已经不再继续适用。
实际上在我们的电脑中,这样的场景每时每刻都在发生,
因为当今的绝大多数操作系统都支持多任务,
而操作系统对于多任务的调度策略也与门诊医生类似。
如果将电脑类比于医院,那么CPU就类似于门诊医生,
而同时参与调度的计算任务,则可类比于同时等候门诊的一批病人。
在这里,每个任务都有一个指标,有的数值更大,有的数值略小。
当然,这些指标都是动态变化的,
而操作系统总会挑选指标最大的那个任务,交由CPU进行处理。
在这里,每个任务所拥有的指标,可以类比于每个病人的病情严重程度,
这个指标的数值越大,或者病情越严重,则会优先接受服务,
因此我们也称之为“优先级别”,或者简称“优先级”(priority)。
在算法方面,这类的需求更是举不胜举。
比如,在Huffman编码树的构造算法中,
我们就需要将整个森林组织为某种高效的数据结构,
从而可以使得我们可以反复地从中取出权重最小的两棵子树,
并将它们合并之后,重新加入到森林之中。
而在基于扫描线策略的诸多算法中,
我们也需要将所有的事件点组织成某种高效的数据结构,
从而使得我们可以反复取出最邻近的事件,
完成相应的处理,
并将可能生成的新事件加入到这个数据结构当中。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试