当前课程知识点:数据结构(下) > 第十章 优先级队列 > (xa1)左式堆:结构 > 10xa1-4: NPL
为了度量和判断左式堆的单侧倾斜性,我们需要引入一个概念,也就是所谓的“空节点路径长度”。
为了便于我的讲解和你的理解,我们继续沿用之前在红黑树和B树中已经多次采用的一个技巧,
也就似乎通过引入足够多个外部结点将整个堆假想地转化为一棵真二叉树。
比如在这幅图中,所有深色节点都是原有的真实存在的节点,
而所有浅色,也是方形的节点都是我们假想的引入的外部节点。
可以看到,经过这样的一个转换,的确所有节点的度数都变成了偶数。
那么,所谓的空节点路径长度(Null Path Length)又是如何定义的呢?
首先作为基础,对于刚刚引入的每一个外部结点而言,其NPL值都统一设作0,
而对于任何一个原本就存在的内部节点而言,为了确定它的NPL值,
我们需要找到它的左孩子以及右孩子,并且在其中挑选出更小的一个NPL值。
在已知的基础增加一个单位。
看到这个定义的表达式,你或许会想起点什么,没错,节点的高度。
事实上只要把这个min()换成max(),也就是不折不扣的高度。
通过这样的对比和类比,我希望你能够对这两个概念有更深刻的认识。
就这里的NPL而言,我们不难验证以下两个事实:
首先,任意节点x的NPL值,必然等于x到所有外部节点的最近距离,
比如任何一个外部节点的NPL值之所以为0,
是因为它到所有外部节点的距离就是它自己到自己的距离,这个距离自然是0。
我们再来看这个节点,它的NPL值为什么是2呢?
因为尽管它有一个外部节点后代与它的距离为1、2、3,
但这却不是最近的距离,实际上最近的距离应该实现于这样三个后代外部节点:
而且这个距离恰好是1、2。
类似地,这个例子中的根节点NPL值之所以为3,是因为这些外部节点到它的距离最近,
而且这个距离都是1、2、3。
另一个可以验证的事实是,对任何一个x而言,它的NPL值也是以它为根的最大满树的高度。
回到刚才的这个实例,依然考察NPL值为2的这个节点,它的NPL值为2,
我们也可以理解为存在一棵以它为根的高度为2的满树。
事实上,对于其它的节点,例如这个节点,也是如此:
这个节点的NPL值为2,是因为以它为根的最大满子树的高度也是2。
而根节点的NPL值3,也可以理解为以它为根的最大满子树的高度也是3。
至此,我们已经建立了NPL值这样一个重要的指标。以这个指标作为基准,我们就可以来度量堆结构的倾斜性。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试