《算法导论》20.2 递归结构

一、引入

在这里插入图片描述
1、这是来自上一节的图片,上一节中summary大小为u0.5(图中为4),每一项都指向一个大小为u0.5的另一个结构,然后各个项又包括u0.25的项数的结构,直到降低到项数为2。
2、在这里设置在这里插入图片描述,现在回头来看图20-2中的数据结构,一个给定的值x在簇编号⌊x/u0.5⌋中。如果把x看做lgu位的二进制整数,那么簇编号⌊x/u0.5⌋由x中最高(lgu)/2 位决定。在x簇中,x出现在位置x mod√u中,是由x中最低(Igu)/2位决定。后面需要这种方式来处理下标,因此定义以下一些函数:
在这里插入图片描述在这里插入图片描述

二、原型van Emde Boas结构

看书上这一段内容需要耐心
在这里插入图片描述
在这里插入图片描述
这是我画的一个关系图(圈加上箭头相当于或运算,看蓝线和红线就行了,其他是我自己随便画的)
在这里插入图片描述

三、原型 van Emde Boas结构上的操作

MEMBER、SUCCESSOR、PREDECESSOR、INSERT和DELETE操作都-一个参数x和一个proto-vEB结构V作为输人参数。这些操作均假定0 ≤ x< V. u。

1、判断一个值是否在集合中

要实现这个操作,就需要在一个适当的proto-vEB结构V和一个值x作为输入,返回一个位值表示x是否在V包含的动态集合中。

PROTO-vEB-MEMBER(V,x)
if V.u == 2	//测试是否为基础情形,即只有两位
	return V.A[x]	//如果是,简单返回A的相应位即可,有的话就是1,没的话就是0
//递归情形,钻到更小的proto-vEB结构,其中high(x)要访问的是proto-vEB(根号u)结构,low(x)表示要查询的这个结构中的元素
else return PROTO-vEB-MEMBER(V.cluster[high(x)],low(x))

在这里插入图片描述
具体案例:
在这里插入图片描述

2、查找最小元素(按照图来)

PROTO-vEB-MINIMUM(V)
//判断并且处理基础情形
if V.u == 2
	if V.A[0] == 1
		return 0
	elseif V.A[1] == 1
		return 1
	else return NIL
//通过递归查找,先通过summary向下查找,然后发现最下面的summary中A[0] = 1,从而min-cluster = 0
else min-cluster = PRO-vEB-MINIMUM(V.summary)
	if min-cluster == NIL
		return NIL
	//通过递归查找,找V.cluster[0]中最小的元素,然后返回就行
	else offset = PROTO-vEB-MINIMUM(V.cluster[min-cluster])
		return index(min-cluster,offset)

在这里插入图片描述

3、查找后继

PROTO-vEB-SUCCESSOR(V,x)
//最一般的情况
if V.u == 2
	//如果x下标为0且后一位存在,那么返回后一位的关键字
	if x == 0 and V.A[1] == 1
		return 1
	else return NIL
//其他情况
else 
	offset = PROTO-vEB-SUCCESSOR(V.cluster[high(x)],low(x)) //在x簇内查找后继,将结果变量赋值给offset
	if offset != NIL
		return index(high(x),offset)
	else 
	succ-cluster = PROTO-vEB-SUCCESSOR(V.summary,high(x))	//将下一个非空的簇号交给变量succ,相当于查找high(x)这个簇的后继簇
		if succ-cluster == NIL
			return NIL
		//如果非空,那么将这个簇中第一小的元素赋值给offset
		else offset = PROTO-vEB-MINIMUM(V.cluster[succ-cluster])
			return index(succ-cluster, offset)//通过计算返回

插入元素

PROTO-vEB-INSERT(V,x)
if V.u == 2
	V.A[x] = 1
else PROTO-vEB-INSERT(V.cluster[high(x),low(x)]) //将x插入到相应的簇中
	PROTO-vEB-INSERT(V.summary,high(x))	//将相应簇的summary位置变为1

删除元素

先判断相应的簇中是否存在为1的位,对于已经定义的proto-vEB结构,本来需要检查簇内所有的u0.5是否为1,但我们可以换一种方式,在proto-vEB中添加一个属性n,记录其拥有元素个数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepCoding♪Toby♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值