MIT:算法导论——11.扩充的数据结构、动态有序统计和区间树

MIT算法导论——第一讲.Analysis of algorithm 学习笔记和心得来自网易MIT公开课算法导论Introduction to Algorithms中Charles E.Leiserson和Erik Demaine老师的讲解,以及网上一些大牛的博客。     参考一:网易MIT公开课算法导论     参考二:插入排序     参考三:算法的时间复杂度和空间复杂度-总结     参考四:MIT算法导论——第一讲 阅读详情

算法导论第14章 【数据结构的扩张】
    为应对新的应用需求,经常是通过存储额外信息的方法来扩张一种标准的数据结构,
然后对这种数据结构,编写新的操作来支持所需要的应用。


一、动态顺序统计
一种支持一般动态集合上,顺序统计操作的数据结构。
通过这种数据结构,可以快速地找到一个集合中的第i小的数,(select)
或给出一个指定元素在集合的全序中的位置。(rank)
【已知】对于一个无序的集合,能够在O(n)的时间内确定任何的顺序统计量。
rank(x):获得x在数组中的位置,遍历数组并统计比x.key小的元素数即可。
select(i):利用random-partion()函数,二分地去定位即可。
【目标】修改红黑树,使得在O(lgn)时间内确定任何的顺序统计量。
【顺序统计树】在每个结点上存储附加信息的一棵红黑树。
除了基本结点属性x.key、x.color、x.p、x.left、x.right之外,还附加x.size属性。
设哨兵T.nil的x.size为0,则有等式: x.size = x.left.size + x.right.size + 1。

OS-SELECT( x, i ) // 过程返回一个指针,指向以x为根的子树中包含第i小关键字的结点
	r = x.left.size + 1
	if i == r
		return x
	else if i < r
		return OS-SELECT( x.left, i )
	else
		return OS-SELECT( x.right, i - r )
OS-RANK( T, x ) // 过程返回T中序遍历对象的线性序中x的位置
	r = x.left.size + 1
	y = x
	while y != T.root
		if y == y.p.right
			r += y.p.left.size + 1
		y = y.p
	return r
【OS-RANK解释】
如果y是y.p的左孩子,y.p和y.p的右子树中所有结点都不会先于x,r保持不变。
如果y是y.p的右孩子,y.p和y.p的左子树中所有结点都先于x,r要加上y.p.left.size + 1。
【对子树规模的维护】
LEFT-ROTATE( T, x )的代码,要添加下面两行:
y.size = x.size // y = x.right
x.size = x.left.size + x.right.size + 1
RIGHT-ROTATE( T, x )的代码,要添加下面两行:
y.size = x.size
x.size = x.left.size + x.right.size + 1
维护size时间复杂度:O(1)。所以插入、删除,包括维护size属性,都只需要O(lgn)时间。


二、如何扩张数据结构(Ex. OS-trees)
(1)选择一种基础数据结构。(red-black tree)
(2)确定基础数据结构中要维护的附加信息。(subtree size,直接记录秩也可以,不过速度太慢了)
(3)检验基础数据结构上的基本修改操作能否维护附加信息。(Insert、Delete/Rotate是否可以维持子树大小的信息)

(4)设计一些新操作。(怎么使用这些信息:OS-Select、OS-Rank)


【实际使用时】上面可能更像一个checklist,而设计时可以先设计一个些新操作(4),再去验证附加信息维护等。

【2+2】2组数据 + 2组操作:基础操作+附加操作 : 基本操作+新添操作



三、区间树
一个区间[t1, t2]表示成一个对象i,其中属性i.low = t1为低端点, i.high = t2为高端点。
【区间i与i'重叠(overlap)】
如果i与i'的交集非空,即如果i'.low <= i.high and i.low <= i'.high。
任何两个区间i与i'满足【区间三分定律】,即下面三条性质之一成立:
(1)i和i'重叠。
(2)i在i'的左边,即i.high < i'.low

(3)i在i'的右边,即i.low > i'.high


Example Interval Trees : Maintain a set of intervals.

eg : time intervals.




【区间树】一种对动态集合进行维护的红黑树,其中每个元素x都包含一个区间x.int。
区间树支持下列操作:
(1)INTERVAL-INSERT( T, x ):将包含区间属性的int的元素x插入到树T中。
(2)INTERVAL-DELETE( T, x ):从T删除x。
(3)INTERVAL-SEARCH( T, i ):返回一个指向T中元素x的指针,使x.int与i重叠。不存在返回T.nil。
【扩张数据结构】
步骤1:基础数据结构
一棵红黑树,每个结点x包含一个区间属性x.int,且x的关键字为区间int的低端点x.int.low。
所以该数据结构的中序遍历,就是按低端点的次序排列的各区间。
步骤2:附加信息
包含一个值x.max,它是以x为根的子树中,所有区间的端点的最大值。
步骤3:对信息维护
通过x.int和x子结点的max,有 x.max = max( x.int.right, x.left.max, x.right.max )。
故一次旋转后,更新max属性只要O(1)的时间;所以插入和删除的运行时间为O(lgn)。
步骤4:设计新操作。
INTERVAL-SEARCH( T, i )
	x = T.root
	while x != T.nil and i does not overlap x.int
		if x.left != T.nil and x.left.max >= i.low // i'.low <= i.high 
			x = x.left
		else
			x = x.right
	return x
【解释】
分支if执行时,如果在以x.left为根的子树中,没有与i重叠的区间,
则树的其他部分也不会包含与i重叠的区间。
分析:有x.left.max >= i.low,根据max属性定义,在x的左子树中必定存在某区间i',满足:
i'.high = x.left.max >= i.low,
如果i与i'不重叠,则i.high < i'.low <= i''.low,其中i''为右子树中任意区间,
所以右子树也不包含与i重叠的区间。

========================================================================

【图示化补充】

【顺序统计树】下面给出一个修改后的红黑树的例子,如下图所示:

【区间树】修改红黑树得到的区间树如下图所示:

从图可以看出,对区间树以每个节点的左端点值进行中序变量即可得到有序的序列。




麻省理工公开课:算法导论(书、讲义、字幕、笔记、答案) 麻省理工公开课:算法导论的最全资源整理,包括算法导论书、讲义、字幕、笔记、课后习题答案等等 立即下载

相关推荐

MIT算法导论全集(讲义+答案)

麻省理工算法讲义与答案 教材大家应该都有了。 没有的想要请留言。

MIT算法导论(一)——算法分析和引论

MIT精品课程原作大牛讲解:算法分析及引论

弄鹊 1463

中心对数比变换(Centered Log Ratio Transformation,CLR)的原理及scikit-bio介绍

中心对数比变换(Centered Log Ratio Transformation,CLR)是一种数据预处理方法,常用于成分数据分析领域。在成分数据中,各成分之间通常存在一定的约束关系,比如它们的和为固定值等,中心对数比变换可以有效地处理这种具有特殊约束的数据。官方文档scikit-bio是一个在Python3中处理生物数据的库成分统计 (skbio.stats.composition )模块中的,此函数将组合从Aitchison几何体转换到真实空间。这个clr。

RECORD LEARN PROGRESS 1万+

麻省理工学院《算法导论》(MIT - Introduction to Algorithms)

关于课本的介绍如下: 本书自第一版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考手册。本书全面论述了算法的内容,从一定深度上涵盖了算法的诸多方面,同时其讲授和分析方法又兼顾了各个层次读者的接受能力。各章内容自成体系,可作为独立单元学习。所有算法都用英文和伪码描述,使具备初步编程经验的人也可读懂。全书讲解通俗易懂,且不失深度和数学上的严谨性。第二版增加了新的章节,如算法作用

专注 机器学习+人工智能 3386

第十二节:C#工业控制编程基础--输出正弦波实验

第十二节:基于c#使用开发板输出正弦波实验 文章目录第十二节:基于c#使用开发板输出正弦波实验一、实验目的:了解采集卡DA相关函数的使用。二、实验内容:利用C#生成正弦波,然后用采集卡DA输出。三、实验步骤:1.打开Visual Studio 2013,新建窗体应用程序项目,配置好板卡dll文件。2.在窗体中放入控件,对控件进行布局排版,并修改他们的Name属性和Text属性。3.在Chart控件内选择Spline型图表,如图2。4.进入编程区域,在public partial class Form1 :

weixin_49237052的博客 2294

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

【MIT算法导论】算法分析与基础知识

MIT算法导论第一弹~;插入排序和归并排序的渐进分析。

kodoshinichi的博客 796

双相机坐标系标定

工业双相机对位标定

sinat_33762356的博客 8316

[笔记]|[算法]MIT算法导论公开课笔记(1)——排序

[笔记]|[算法]MIT算法导论公开课笔记(1)——排序 python版本:python3.6 IDE:pycharm 更新日期:19/3/14 文章目录[笔记]|[算法]MIT算法导论公开课笔记(1)——排序相关材料排序算法插入排序伪代码:实现过程:时间复杂度:具体代码:归并排序伪代码:递归树分析:实现思路:时间复杂度:具体代码: 算法分析是关于计算机程序性能和资源利用的研究 相关材料 视频...

weixin_43991786的博客 451

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 352

开源模型应用落地-qwen模型小试-入门篇(二)

在windows环境下,使用transformer设置模型参数/System Prompt/历史对话

以微薄之力,予他人些许温暖. 3232

MIT公开课《算法导论》笔记二:渐近符号、递归及解法

内容均来自MIT公开课Introduction to Algorithms中Charles E. Leiserson和Erik Demaine老师的讲解。http://v.163.com/special/opencourse/algorithms.html 一. 渐进符号 a. 大O表示法       存在正数c与N,对所有的n≥N,满足 0 ≤ f(n) ≤ cg(n )。f(

wizap1的专栏 939

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3051

MIT算法导论公开课之第11课 扩充的数据结构、动态有序统计和区间树

动态有序统计 主要操作: OS-Select(i)//返回动态集中第i小的元素。 OS-Rank(x) //返回动态集排序序列中元素x的位置。 新增数据: 在每个结点中保存其子树的结点个数。 size[x]=size[left[x]]+size[right[x]]+1 size[nil]=0 处理nil的通用技巧: 标记法,给空结...

rye_whiskey的博客 1024

Linux iperf 进行跑流测试时,为啥单条流会有速率上不去的问题?

iperf

1042484520@qq.com(邮箱) 3086

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MIT算法导论公开课之课程笔记

MIT算法导论公开课之第1课 课程简介及算法分析 MIT算法导论公开课之第2课 渐进符号、递归及解法 MIT算法导论公开课之第3课 分治法 MIT算法导论公开课之第4课 快排及随机化算法 MIT算法导论公开课之第5课 线性时间排序 MIT算法导论公开课之第6课 顺序统计、中值 MIT算法导论公开课之第7课 哈希表 MIT算法导论公开课之第8课 全域哈希和完全哈希 MIT算法导论公开...

rye_whiskey的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【转载】算法导论学习笔记

参考出处 链接: [https://blog.csdn.net/rye_whiskey/article/details/82216352] 作为记录我的算法之路的起点!!!! 简介 此算法导论课程为麻省理工学院的官方课程录像,以《算法导论》为教材,授课老师为这本书的作者Charles Leiserso...

qq_35982713的博客 232

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构视频教程 -《[麻省理工学院]_算法导论_翻译版》

整个视频打包下载地址:史上最全的数据结构视频教程系列分享之《[麻省理工学院]_算法导论_翻译版》,转载请保留出处和链接! 更多优秀资源请访问:我是码农 MIT无论是在美国还是全世界都有非常重要的影响力,培养了众多对世界产生重大影响的人士,是全球高科技和高等研究的先驱领导大学。本视频教程主要讲授高效率算法的设计及分析技巧,并着重在有实用价值的方法上。课程主题包含了排序、堆积及散列;各个击破法、...

774

[麻省理工学院]_算法导论_翻译版

MIT无论是在美国还是全世界都有非常重要的影响力,培养了众多对世界产生重大影响的人士,是全球高科技和高等研究的先驱领导大学。本视频教程主要讲授高效率算法的设计及分析技巧,并着重在有实用价值的方法上。课程主题包含了排序、堆积及散列;各个击破法、动态规划、网络流、计算几何、数字理论性算法、高速缓存技术及并行运算等。[麻省理工学院]_算法导论_翻译版 整包下载(zjg0)[第1集] 课程简介及算法分...

测试 637

【MIT算法导论】快排及随机化算法

前言 本文是B站公开课《MIT算法导论》的随课笔记,对于笔记内容和格式有问题的朋友欢迎私信或评论区交流~ 快速排序算法也是分治算法的应用之一,且是原地排序(在原来的数据区域进行元素重排),快速排序也十分实用。 一. 快速排序的描述 快排中的分治策略 ①Divide 选取一个关键元素,并根据这个关键元素的大小把数组划分成两个子数组部分,左边的子数组小于该关键元素;右边的子数组中的元素≥该关键元素。 ②Conquer 递归地处理两个子数组的排序问题 ③Combine 在快排问题中,结合这一步并不

kodoshinichi的博客 814

算法系列笔记5(扩展数据结构-动态顺序统计和区间树)

在编程中,我们往往使用已有的数据结构无法解决问题,这是不必要急着创建新的数据结构,而是在已有数据结构的基础上添加新的字段。本节在上一次笔记红黑树这一基础数据结构上进行扩展,得出两个重要的应用—动态顺序统计和区间树。 动态顺序统计        在算法系列笔记2中我们在线性时间内完成了静态表的顺序统计,而这里我们在红黑树上进行扩展,在O(lgn)时间内完成该操作,主要包括返回第i 排名的元素o

小村长技术blog 2156

[算法导论]网易MIT算法导论课笔记(简略版)

Introduction to Algorithm 说明lgn是以2为底的对数 编译环境:g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 g++ -std=c++11 XX.cpp -o XX 第一课 算法分析 插入排序 源码 归并排序 源码 第二课 渐近符号、递归及解法 f(n)的值总位于c1g(n)与c2g(n)之间或等于它们,那么记f(n)

xy_cpp的博客 2433

MIT算法导论公开课之第16课 贪婪算法、最小生成树

关于图的知识回顾(附录B) 有向图(Digraph,Direct graph)G=(V,E),V为图的顶点集,E为边集,E∈V x V。 无向图(Undirected graph)G=(V,E),E为无向的边集。 |E|=O(V^2) 连通图,对于图中的任意顶点,总有路径可以到达其他顶点,|E|&gt;=|V|-1。 对于连通图,则有lg|E|= O(lg(V^2))=O(lgV)=Ω(lg(|...

rye_whiskey的博客 1350

麻省理工《算法导论》课程笔记——第1课时

本文是本人观看麻省理工算法导论公开课的笔记整理而成,并且将算法使用C语言实现。

wwl15840210640的博客 1169

MIT算法导论公开课之第3课 分治法

分治法 1. 将一个问题划分为若干个子问题。 2. 递归的解决每一个子问题。 3. 将子问题的解合并成为整个大问题的解。 归并排序 1. 将一个数组分为两个子数组。 2. 递归的对每一个子数组进行排序。 3. 合并两个有序子数组。 运行时间 递归函数为T(n)=2T(n/2)+Θ(n)。 使用主方法,为case2 ,所以T(n)= Θ(nlgn)。 二分查找 在...

rye_whiskey的博客 2108
上一篇: 【编程语言】C/C++面试问题
下一篇: 【C++Primer Ch5表达式】类型转换:显示转换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值