第20章-van Emde Boas树 20.1-基本方法

注意:这些基本方法有利于后续理解van Emode Boas树

一、直接寻址

(1)操作特点:维护一个u位的数组A[0…u-1],用来存储一个值来自全域{0,1,2,3,…u-1}的动态集合。如果值属于动态集合,那么元素A[x] = 1,否则A[x] = 0。
(2)优缺点:虽然利用位向量的方法可以让INSERT、DELETE、MEMBER的操作运行时间为O(1),但是其余操作(MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR)在最坏情况下仍需θ(u)的运行时间,这是因为操作需要扫描θ(u)个元素。
(3)例子:如果一个集合只包含值0和u-1,则要查找0的后继,就需要查询1到u-2的所有结点,直到发现A[u- 1]中的1为止。

二、叠加的二叉树结构

位向量的全部元素组成了二叉树的叶子。内部结点中存储的位就是其两个孩子的逻辑或。
现在使用这种树结构和未经修饰的位向量,具有最坏情况运行时间为0(u)的操作如下:
● 查找集合中的最小值,从树根开始,箭头朝下指向叶结点,总是走最左边包含1的结点。
● 查找集合中的最大值,从树根开始,箭图头朝下指向叶结点,总是走最右边包含1的结点。
● 查找x的后继,从x所在的叶结点开始,箭头朝上指向树根,直到从左侧进入一个结点,其右孩子结点z为1。然后从z出发,箭头朝下,始终走最左边包含1的结点。(查找以z为根的子树的最小值)
● 查找x的前驱,从x所在的叶结点开始,箭头朝上指向树根,直到从右侧进入一个结点,其左孩子结点z为1。然后从结点z出发箭头向下,始终走最右边包含1的结点(即查找以z为根的子树的最大值)
第20章-van Emde Boas树 20.1-基本方法_第1张图片

三、叠加的一棵高度恒定的树

1、假设全域大小为22k,这里k是某个整数(假设为16),那么u0.5(2k)为4,反正就是个整数。我们叠加一棵度为u0.5的树,来代替上面的二叉树。
2、第20章-van Emde Boas树 20.1-基本方法_第2张图片
如图,每个内部结点存储的都是子树的逻辑或。我们为这些结点定义一个数组summary[0…u0.5-1],其中summary[i]包括A[iu0.5…(i+1)u0.5-1]比如summary[0]包括A[0…3],四个四个来的;我们这个u0.5位子数组为第i个簇。对于一个给定的值x,A[x]会出现在簇号[ ⌊x/u0.5⌋ ]中,比如3就在簇号0中。要插入x,就先置A[x]和summary[ ⌊x/u0.5⌋ ]为1。
3、其他操作
●查找最小(最大)值,在summary数组中查找最左(最右)包含1的项,如summary[i],然后在第i个簇内顺序查找最左(最右)的1。
●查找x的后继(前驱),先在x的簇中向右(左)查找。如果发现1,则返回这个位置作为结果;否则,令i=⌊x/u0.5⌋,然后从下标i开始在summary数组中向右(左)查找。找到第一个包含1的位置就得到这个簇的下标。再在该簇中查找最左(最右)的1,这个位置的元素就是后继(前驱)。
●删除值x,设i=⌊x/u0.5⌋。将A[x]置为0,然后置summary[i]为第i个簇中所有位的逻辑或。
4、代价
在这里插入图片描述

你可能感兴趣的:(算法导论阅读,算法,数据结构,van,Emde,Boas树)