《数据结构扩张》是《算法导论》第三部分的最后一章。在介绍学习了这么多种数据
结构之后,简要介绍了当这些基本数据结构不满足需求时,如何扩张它们来满足需求。
这才是学习算法的目的,能够根据需求选择合适的数据结构和算法,并在无法满足需求
时能够扩张它。这才是对算法的思想和本质的学习!
可以将本章看做深入学习的前奏吧,因为紧接着就要开始进入第四部分《高级设计和分析
技术》了。那么赶快来看看如何扩张数据结构,然后就进入高级部分的学习吧!
1.如何扩张数据结构?
1)选择基础数据结构
2)确定要在基础数据结构中添加哪些信息
3)验证可用基础数据结构上的基本操作来维护新添加的信息
4)设计新的操作
下面来看一个简单的数据扩张的例子 - 动态顺序统计树。《算法导论》中选用红黑树
作为基础数据结构,这里为了简单,用最简单的二叉查找树来实现。这样我们可以集中
注意力在数据结构扩张的方法上。
2.动态顺序统计树
在第九章《中位数和顺序统计》中,我们曾研究过如何求数组中的元素的顺序统计量。
如查找最大值、最小值、第 i 小的值等等。其中求第 i 小元素时采用了随机快速排序的
RANDOMIZED-PARTITION划分方法,从而达到了Θ(n)的期望运行时间。
本节要研究的是动态顺序统计量,与之前的有些类似,首先我们来看面对这个需求,
如何选择合适的数据结构,并在必要时进行简单的扩张。
1)选择基础数据结构
我们面对的需求是维护动态集合,即数据可能会频繁的插入和删除,固定长度的数组
显然不适合这种情形。所以我们可以选择二叉查找树作为基础数据结构,但基本的
二叉查找树实现顺序统计功能是很低效的,所以还要添加新的域来扩张它。
2)确定要在基础数据结构中添加哪些信息
我们选择在每个结点添加一个新的size域,来保存每棵子树的大小(包含的结点树,包括
此根结点自身)。更自然的想法是新加一个rank域,直接保存每个结点的顺序统计量,
但这样插入和删除时可能会麻烦一些,参见习题14.1-6。
3)验证可用基础数据结构上的基本操作来维护新添加的信息
如前所述,添加size而不是rank域是为了只对原有数据结构略作改动,就足以维护附加信息,
这是比较理想的情况。如果添加rank域,当插入一个最小元素时,所有结点的rank域都要变。
4)设计新的操作
新的操作就是我们需求中所需的,OS-SELECT求顺序统计量为 i 的结点和OS-RANK求一个
结点的顺序统计量。
3.实现源码
下面来看实现代码,这里只列出BST实现的改动部分,着重来看新加的操作和对BST的影响。
4.运行情况详细分析
现在以查找第 i = 17小的元素来看OS-SELECT的执行过程。
| |
| |
[ 3, 7, 10, 12, 14,14, 16, 17, 19, 20,21, 21, 26, 28, 30,35, 38, 39,41, 47]
1.从根结点26开始,其顺序统计量 r = 26左子结点size + 1 = 13 < i,则递归OS-SELECT(26右子结点, i - r),
即OS-SELECT(结点41,4)。
[ 3, 7, 10, 12, 14,14, 16, 17, 19, 20,21, 21,26, 28, 30,35, 38, 39,41, 47]
2.根结点变为41,i = 4,r = 5 + 1 = 6 > i,递归OS-SELECT(41的左子结点, i ),即OS-SELECT(结点30, 4)。
[3, 7, 10, 12, 14,14, 16, 17, 19, 20,21, 21, 26,28, 30,35, 38, 39,41, 47]
3.根结点变为30,i = 4,r = 1 + 1 = 2 < i,递归OS-SELECT(结点38, 2)。
[ 3, 7, 10, 12, 14,14, 16, 17, 19, 20,21, 21, 26,28, 30,35, 38, 39,41, 47]
4.根结点变为38,i = 2,r = 1 + 1 = 2 == i,找到了!结点38即为顺序统计量17的元素。
[3, 7, 10, 12, 14,14, 16, 17, 19, 20,21, 21, 26, 28, 30,35,38, 39,41, 47]
看到OS-SELECT的实现了吧,跟第九章的RANDOMIZED-SELECT多么相似。从根结点开始遍历,
首先计算根节点的顺序统计量设为r,若比 i 小则继续处理根节点的左子树,否则处理右子树。
我们可以将每次递归处理的根节点node看做RANDOMIZED-PARTITION返回的划分元素A[q],
若 i 比A[q]的顺序统计量小则继续处理较小的数组部分,否则处理大的那部分。如出一辙!
分享到:
相关推荐
算法导论第二十四章答案 算法导论第二十四章答案 算法导论第二十四章答案
第十七章通常涉及的是图算法,这部分内容在实际编程中有着广泛的应用,比如网络路由、最短路径计算、任务调度等。以下是对第十七章习题解答的详细解析。 1. **图的基本概念**:图是由顶点(节点)和边构成的数据...
《算法导论》是计算机科学领域的一本经典教材...总的来说,《算法导论》第十四章的习题解答涵盖了图论的许多重要概念,通过实践这些习题,我们可以提升在图算法方面的理论和实践水平,为未来解决复杂问题打下坚实基础。
通过深入学习和解决《算法导论》第二十四章的习题,你将能更好地掌握高级算法和数据结构,这对任何IT专业人员来说都是宝贵的技能。记住,实践是检验理论的最好方式,不断练习和应用这些知识,将使你在面对实际问题时...
算法导论第四章答案算法导论第四章答案算法导论第四章答案算法导论第四章答案
《算法导论》第二十章习题解答涵盖了各种高级算法问题,主要涉及图论和网络流等内容。在这一章中,作者深入探讨了如何解决实际问题,如最短路径、最大流最小割以及网络调度等问题。以下是部分习题的解析和相关知识点...
这本书的第31至35章包含了许多关键的算法概念,这些章节深入探讨了不同的算法主题,对于理解和掌握算法有着至关重要的作用。以下是这五个章节的主要知识点: **第31章:动态规划** 动态规划是一种解决最优化问题的...
算法导论第15章-动态规划的课后习题参考答案,对于算法爱好者而言,是不错的参考资料。
第十四章 扩充的数据结构(Augmenting Data Structures) 第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques) 第十五章 动态规划(Dynamic Programming) 第十六章 贪婪...
算法导论英文原版,数据结构与算法,算法导论英文原版,数据结构与算法
算法导论 第二十五章 答案 算法导论 第二十五章 答案 算法导论 第二十五章 答案
《算法导论》第二十三章主要探讨的是图算法,包括图的基本概念、图的表示方法、图的遍历以及各种图的特殊结构如最小生成树、最短路径等。本章习题解答涵盖了这些核心知识点,旨在帮助读者深入理解和应用所学理论。 ...
第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第15章 动态规划 第16章 贪心算法 第17章 平摊分析 第五部分 高级数据结构 概述 第18章 B树 第19章 二项堆 第20章 斐波那契堆 第21章 用于不相交集合的数据...
- **第十四章:流网络** - 流网络的概念与模型 - 最大流问题及其求解算法 - 网络流的实际应用案例 - **第十五章:线性规划** - 线性规划的基本概念与数学模型 - 简单x法与线性规划的求解 - 线性规划的应用...
算法导论(现代计算机常用数据结构和算法)
所有代码都是在我学习这本书时亲手敲出来的,并且调试正确了,包括:第三部分到第六部分(即10-26章),外加第七部分31和32章所有的算法和数据结构以及编程习题还有思考题的C++实现源代码; 第一、二部分学习的较早...
请参考算法导论第三版英文版Introduction to Algorithms 3rd Edition,本程序为第10章到第14章常用数据结构的c/c++实现。 IDE环境为vc++ 6.0。 主要包括: 队列 双向链表 哈希表 二叉搜索树
《算法导论》是计算机科学领域的一本经典教材,涵盖了广泛的算法理论和实践知识。21至25章是该书的重要部分,涉及到许多关键的算法设计和分析方法。以下是对这五章主要内容的详细解释: 第21章:图算法 在这一章中...
算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业...
前者很显然是《算法导论》第三版的电子版,读者可以通过这份PDF文档深入学习书中涵盖的各种算法,如排序、搜索、图算法、动态规划、贪心算法、分治策略等。这些算法是计算机科学的基础,对于提升编程能力和解决复杂...