DST详解beta1.docVIP

  • 1
  • 0
  • 约4.5千字
  • 约 9页
  • 2016-11-27 发布于河南
  • 举报
DST详解beta1

DST详解 风过叶落 几个月前,小魚兒小魚兒过程DST相对更加平衡。 删除操作的伪代码如下: 1 Delete(k,p) 2 S[p] ← S[p]-1 3 If Key[p]k then Delete(k,Right[p]) 4 else 5 If Key[p]=0 then 6 If S[p]=0 then p=0 7 else 8 If S[Left[p]]=S[Right[p]] then 9 Key[p]←maximum(Left[p]) 10 Delete(Key[p],Left[p]) 11 else 12 Key[p]←minimunm(Right[p]) 13 Delete(Key[p],Right[p]) 14 else delete(k,Right[p]) 15 Maintain(p,ture) 16 Maintain(p,false) DST的平衡 (1)DST的旋转 在介绍具体算法之前,有必要明确一下二叉搜索树保持平衡的方法——旋转。 图 1 图 2 3所示,对T(Left[A])做一次左旋操作,然后对T(A)做一次右旋操作;或者对 T(Right[A])做一次右旋操作,然后对T(A)做一次左旋操作,叫做对T(A)进行“复杂旋转”。 图 3 这个条件被称为DST的平衡条件,在本文中简称平衡条件。 ])都是DST时,我们认为T(A)是一棵DST。 (3)DST的平衡维护(maintain)以及维护的时间复杂度 在一棵DST(设为T(A))中插入或者删除节点有可能会导致它不再平衡,这时需要利用maintain过程对T(A)进行维护。 首先给出maintain过程的伪代码: 1 Maintain(p,flag) 2 If flag then 3 If S( Left[p] )= S( Right[p] ) *2 +1 then exit 4 else 5 If S ( Left [ Lfet[p] ])S( Right [ Left[p] ] ) then Left_Rotate( Left[p] ) 6 Right_Rotate(p) 7 else 8 If S( Right[p] )=S( Left[p]) *2 +1 then exit 9 else 10 If S ( Right[ Right[p] ] )S ( Left[ Right[p] ] ) then Right_Rotate(Right[p]) 11 Left_Rotate(p) 12 Maintain (Left[p],false) 13 Maintain (Left[p],true) 14 Maintain (Right[p],false) 15 Maintain (Right[p],true) 在这里我们只讨论在某些操作(如插入、删除、维护平衡时的旋转)使得 从而导致T(A)不平衡的情况,而对称的情况可以得到类似的结论。 ①如图2, 时,我们对T(A)进行一次简单旋转(右旋)。 ②如图3,当 时,我们对T(A)进行一次复杂旋转(左旋左子树,右旋整个子树)。 可以证明,这样旋转之后,整棵子树一定是平衡的。但是我们不能保证旋转后的左右子树也是平衡的,所以需要对左右子树进行维护。因为对于一棵子树的操作不会影响它的兄弟子树和它的父亲,所以没有必要再次对T(A)进行维护。 由于每次旋转之后T(A)所有结点的深度和至少减少了1 [2],而这个深度和是的。因此建立一棵DST至多进行了次旋转,所以,对于T(A)的每个结点,插入或者删除它的均摊时间复杂度是。而插入一个结点共调用了次 maintain 操作,所以每次 maintain 的均摊时间复杂度是。 (4)DST的最坏高度 在以上的论述中,我们得到了DST支持的所有操作的时间复杂度都依赖于它的高度的结论,下面将给出DST的最坏高度是的证明。

文档评论(0)

1亿VIP精品文档

相关文档