当前位置: 首页 > news >正文

《算法导论》第14章-数据结构的扩张 14.1-动态顺序统计 14.2-如何扩张数据结构

14.1 动态顺序统计

1、顺序统计数:图14-1显示了一种支持快速顺序统计操作的数据结构。顺序统计树(order-statistic tree)T 只
是简单地在每个结点上存储附加信息的一棵红黑树。在红黑树的结点x中,除了通常属性
x.key、x.color、x.p、x.left 和x.right之外,还包括另一个属性x.size。这个属性包含了以x
为根的子树(包括x本身)的(内)结点数,即这棵子树的大小。如果定义哨兵的大小为0,也就是
设置T.nil.size为0,则有等式:
x.size = x.left.size+x.right.size+1
在这里插入图片描述
2、秩:在集合线性序中的位置。

查找具有给定秩的元素

OS-SELECT(x,i)
r = x.left.size + 1
if i == r
	return x
elseif i < r
	return OS-SELECT(x,left,i)
else return OS-SELECT(x.right,i-r)

确定一个元素的秩

OS-RANK(T,x)
r = x.left.size + 1
y = x
while y != T.root
	//如果y是右结点,那么加上左兄弟结点上的数量再加上父结点(+1)
	if y == y.p.right
		r = r + y.p.left.size + 1
	y = y.p
return r

以上代码

#include <iostream>
#include <string>
using namespace std;
struct RbTreeNode
{
	string color;
	RbTreeNode* left;
	RbTreeNode* right;
	RbTreeNode* parent;
	int value;
	int size;
	RbTreeNode(int x,int y) :value(x),size(y), left(NULL), right(NULL),parent(NULL) {}
};
//引用哨兵机制
struct RbTree
{
	RbTreeNode* root;
	RbTreeNode* nil;
};
//寻找第i小关键字
RbTreeNode *os_select(RbTreeNode* root, int i)
{
	int r = root->left->size + 1;
	if (i == r||root->left->value ==-1||root->right->value==-1) {
		return root;
	}
	else if (i < r) {
		return os_select(root->left, i);
	}
	else {
		return os_select(root->right, i - r);
	}
}
//确定元素的秩
int os_rank(RbTree* T, RbTreeNode* x)
{
	//先加上自己身上的size
	int r = x->left->size + 1;
	RbTreeNode *y = x;
	while (y != T->root) {
		//如果y是右结点,那么加上左兄弟结点上的数量再加上父结点(+1)
		if (y == y->parent->right) {
			r = r + y->parent->left->size + 1;
		}
		y = y->parent;
	}
	return r;
}
int main()
{
	RbTree* T = new RbTree();
	T->nil = new RbTreeNode(-1,-1);
	T->root = new RbTreeNode(4,7);
	T->root->parent = T->nil;
	RbTreeNode* l = new RbTreeNode(2,3);
	T->root->left=l;
	l->parent = T->root;
	RbTreeNode* ll = new RbTreeNode(1,1);
	 l->left=ll;
	 ll->parent = l;
	RbTreeNode* lr = new RbTreeNode(3,1);
	 l->right=lr;
	 ll->parent = l;
	RbTreeNode* r = new RbTreeNode(6,3);
	T->root->right=r;
	r->parent = T->root;
	RbTreeNode* rl = new RbTreeNode(5,1);
	r->left=rl;
	rl->parent = r;
	RbTreeNode* rr = new RbTreeNode(7,1);
	 r->right=rr;
	 rr->parent = r;
	 ll->left = T->nil; ll->right = T->nil;
	 lr->left = T->nil; lr->right = T->nil;
	 rl->left = T->nil; rl->right = T->nil;
	 rr->left = T->nil; rr->right = T->nil;
	cout<< "第i小的数为" << os_select(T->root, 5)->value<<endl;
	cout << "元素的秩为" << os_rank(T,r) << endl;
}

14.2 如何扩张数据结构

引入

扩张数据结构分为四步:
1.选择一种基础数据结构。
2.确定基础数据结构中要维护的附加信息。
3.检验基础数据结构上的基本修改操作能否维护附加信息。
4.设计一些新操作。

对红黑树的扩张

定理14. 1(红黑树的扩张):设f是n个结点的红黑树T扩张的属性,且假设对任一结点x,
f的值仅依赖于结点x、x.left和x.right的信息,还可能包括x.left. f和x.right.f。那么,我
们可以在插入和删除操作期间对T的所有结点的f值进行维护,并且不影响这两个操作的
O(lgn)渐近时间性能。

相关文章:

  • 前端面试丨综合整理中高级前端最新面试题
  • 大端与小端
  • GBase 8c 数据库内置角色
  • 无需训练、APP可玩,商品、车辆、菜品20+场景一键识别
  • 【Linux 基础笔记】(一)
  • Notion + CloudFlare + 域名搭建网站
  • 自媒体平台上剪视频的素材都是从哪来的?
  • 图像识别与处理学习笔记(四)贝叶斯决策和概率密度估计
  • SQL映射XML文件
  • 基于JavaSwing开发汉诺塔游戏 将盘子从A塔搬运B塔和C塔(自动演示 重新开始) 课程设计 大作业
  • JAVA毕业设计宠物销售网站计算机源码+lw文档+系统+调试部署+数据库
  • Sql中常见的刁钻写法(心得记录)
  • Go sync.Map探究
  • 大数据——Hive SQL优化
  • Python 多进程间访问效率低,如何解决?
  • 【Leetcode】104. 二叉树的最大深度
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 0基础学习移动端适配
  • bootstrap创建登录注册页面
  • CentOS7 安装JDK
  • chrome扩展demo1-小时钟
  • Codepen 每日精选(2018-3-25)
  • eclipse的离线汉化
  • Git同步原始仓库到Fork仓库中
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java|序列化异常StreamCorruptedException的解决方法
  • java第三方包学习之lombok
  • magento2项目上线注意事项
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vuex 笔记整理
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 讲清楚之javascript作用域
  • 聚簇索引和非聚簇索引
  • 学习Vue.js的五个小例子
  • 译自由幺半群
  • 用jQuery怎么做到前后端分离
  • ​什么是bug?bug的源头在哪里?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)常见O(n^2)排序算法解析
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)球球大作战
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)视频码率,帧率和分辨率的联系与区别
  • .“空心村”成因分析及解决对策122344
  • .Mobi域名介绍