10 陈启峰《Size Balanced Tree》

Post on 12-Nov-2014

325 views 0 download

Tags:

description

陈启峰的平衡树论文

Transcript of 10 陈启峰《Size Balanced Tree》

Size Balanced Size Balanced TreeTree

中山纪念中学中山纪念中学高二 陈启峰高二 陈启峰

344368722@QQ.com344368722@QQ.com

总揽全文总揽全文

1.1. BST & Rotations : BST & Rotations : 预备知识 预备知识

2.2. Size Balanced Tree : Size Balanced Tree : 定义 定义 & & 功能介绍功能介绍

3.3. Maintain : Maintain : 核心操作核心操作

4.4. Analysis : Analysis : 时间复杂度分析时间复杂度分析

5.5. Advantage : Advantage : 七大优点七大优点

6.6. 探索历程 探索历程 : : 感性与理性中螺旋前进感性与理性中螺旋前进

Binary Search TreeBinary Search Tree

Binary Search Tree (abbr. BST) Binary Search Tree (abbr. BST) 是一是一棵具有以下性质的二叉树:棵具有以下性质的二叉树:

对于对于 BSTBST 中任意一个结点, 中任意一个结点, (1)(1) 左子树中的关键字不大于它的关键字左子树中的关键字不大于它的关键字 ;;(2)(2) 右子树中的关键字不小于它的关键字右子树中的关键字不小于它的关键字 ..

Binary Search TreeBinary Search Tree

为了方便讨论我们定义:为了方便讨论我们定义:

1.1. Left [T]Left [T] : : 结点 结点 T T 的左儿子的左儿子

2.2. Right [T]Right [T] : : 结点 结点 T T 的右儿子的右儿子

3.3. S [T]S [T] : : 以以 TT 为根的子树的结点个数(大为根的子树的结点个数(大小)小)

RotationsRotations

1.1. 为了保持为了保持 BSTBST 平衡,我们通常使用平衡,我们通常使用 RotaRotations tions 来改变树的形态。来改变树的形态。

2.2. RotationsRotations 分为相对的两种类型:分为相对的两种类型: Right-RotateRight-Rotate Left-RotateLeft-Rotate

Right-RotateRight-Rotate

TT

LL

AA BB

RotationsRotations

表示结点表示结点 表示表示 BSTBST

RR

Right-RotateRight-Rotate

TT

LL

AA BB

RotationsRotations

RR

TTLL

AA BB

RotationsRotations

Right-RotateRight-Rotate

RR

Right-RotateRight-Rotate

TT

LL

AA

BB

RotationsRotations

RR

Size Balanced TreeSize Balanced Tree

Size Balanced Tree (abbr. SBT) Size Balanced Tree (abbr. SBT) 是一种是一种通过大小来保持平衡的通过大小来保持平衡的 BSTBST 。它总是满足:。它总是满足:

对于对于 SBTSBT 的每一个结点 的每一个结点 t,t, 性质性质 (a)(a)s[right[t]]≥s[left[left[t]]], s[right[left[t]]]s[right[t]]≥s[left[left[t]]], s[right[left[t]]]

性质性质 (b)(b)s[left[t]]≥s[right[right[t]]], s[left[rights[left[t]]≥s[right[right[t]]], s[left[right

[t]]][t]]]

i.e.i.e. 每棵子树的大小不小于其兄弟的子树大小每棵子树的大小不小于其兄弟的子树大小

Size Balanced TreeSize Balanced Tree

s[R] ≥ s[A] , s[B]s[R] ≥ s[A] , s[B]

s[L] ≥ s[C] , s[D]s[L] ≥ s[C] , s[D]

TT

LL RR

AA BB DDCC

Size Balanced TreeSize Balanced Tree

InsertInsert 插入插入

DeleteDelete 删除删除

FindFind 查找查找

RankRank 排名排名

SelectSelect 找第找第 KK 小小

PredPred 前趋前趋

SuccSucc 后继后继

当我们插入或删除一个结点后,SBT的当我们插入或删除一个结点后,SBT的大小就发生了改变。大小就发生了改变。

这种改变有可能导致性质这种改变有可能导致性质 (a)(a) 或或 (b)(b) 被破坏。被破坏。

这时,我们需要修复这棵树。这时,我们需要修复这棵树。

MaintainMaintain

MM aintain (T) aintain (T) 用于修复以 用于修复以 T T 为根的 为根的 SBT SBT 。。

调用 调用 Maintain (T) Maintain (T) 的前提条件是的前提条件是 TT 的子树都已经是 的子树都已经是 SBT SBT 了了

MaintainMaintain

由于性质 由于性质 (a) (a) 和 和 (b) (b) 是对称的,下面仅是对称的,下面仅对性质 对性质 (a) (a) 被破坏的情况进行分析:被破坏的情况进行分析:

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]]

S[A]>S[R]S[A]>S[R]

TT

LL RR

AA BB DDCC

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T) TT

LL RR

AA BB DDCC

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T) TT

LL RR

AA BB DDCC

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T)

TTLL

RRAA BB

DDCC

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T)

TT

LL

RR

AA

BB

DDCC

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T)2.2. Maintain (T)Maintain (T)

TT

LL

RR

AA

BB

DDCC

SBTSBT

MaintainMaintain

Case 1: s[Left[Left[T]]>s[Right[T]] Case 1: s[Left[Left[T]]>s[Right[T]] 1.1. Right-Rotate (T)Right-Rotate (T)2.2. Maintain (T)Maintain (T)3.3. Maintain (L)Maintain (L)

LL

AA SBTSBT

SBTSBT

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]]

s[B]>s[R]s[B]>s[R]

TT

LL RR

AA DDCCBB

EE FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L) TT

LL RR

AA DDCCBB

EE FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L) TT

LL RR

AA DDCCBB

EE FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L) TT

LL

RR

AA

DDCCBB

EE FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L) TT

LL

RR

AA

DDCC

BB

EE

FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)

TT

LL

RR

AA

DDCC

BB

EE

FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)

TT

LL

RR

AA

DDCC

BB

EE

FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)

TT

LL RR

AA DDCC

BB

EE

FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)

TTLL

RRAA

DDCC

BB

EE FF

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)3.3. Maintain (L) &Maintain (L) & Maintain (T)Maintain (T)

TTLL

RRAA

CC

BB

EE FF

DD

SBTSBT SBTSBT

MaintainMaintain

Case 2: s[right[left[t]]>s[right[t]] Case 2: s[right[left[t]]>s[right[t]] 1.1. Left-Rotate (L)Left-Rotate (L)2.2. Right-Rotate (T)Right-Rotate (T)3.3. Maintain (L) &Maintain (L) & Maintain (T)Maintain (T)4.4. Maintain (B)Maintain (B)

BB

SBTSBT SBTSBT

SBTSBT

MaintainMaintain

通常我们可以确保性质 通常我们可以确保性质 (a) (a) 或 或 (b) (b) 已经已经被满足了。被满足了。

为了提高效率我们可以增加一个布尔型参为了提高效率我们可以增加一个布尔型参数 数 flag flag 来去除无意义的检查。来去除无意义的检查。

1.1. IfIf flag=false flag=false thenthen2.2. IfIf s[left[left[t]]>s[right[t]] s[left[left[t]]>s[right[t]] then then //case 1//case 13.3. Right-Rotate(t) //case 1Right-Rotate(t) //case 14.4. Else ifElse if s[right[left[t]]>s[right[t]] s[right[left[t]]>s[right[t]] then then //case 2//case 25.5. Left-Rotate(left[t]) //case 2Left-Rotate(left[t]) //case 26.6. Right-Rotate(t) //case 2Right-Rotate(t) //case 27.7. Else Else exit //needn’t repairexit //needn’t repair8.8. Else ifElse if s[right[right[t]]>s[left[t]] s[right[right[t]]>s[left[t]] then then //case 1’//case 1’9.9. Left-Rotate(t) //case 1’Left-Rotate(t) //case 1’10.10. Else ifElse if s[left[right[t]]>s[left[t]] s[left[right[t]]>s[left[t]] then then //case 2’//case 2’11.11. Right-Rotate(right[t]) Right-Rotate(right[t]) //case 2’ //case 2’12.12. Left-Rotate(t) Left-Rotate(t) //case 2’//case 2’13.13. Else Else exit //needn’t repairexit //needn’t repair

MaintainMaintain

MaintainMaintain

14.14. Maintain(left[t],false) //repair the left subtreeMaintain(left[t],false) //repair the left subtree15.15. Maintain(right[t],true) //repair the right subtrMaintain(right[t],true) //repair the right subtr

eeee16.16. Maintain(t,false)Maintain(t,false) //repair the whole tree//repair the whole tree17.17. Maintain(t,true) Maintain(t,true) //repair the whole tree//repair the whole tree

AnalysisAnalysis

Analysis Of HeightAnalysis Of Height F[H]——F[H]—— 高度为 高度为 H H 的的 SBTSBT 最少的结点个最少的结点个

数。数。

F[H]=Fibonacci[H+2]-1F[H]=Fibonacci[H+2]-1H 13 17 21 25 29

F[H] 986 6764 46367 317810 2178308

AnalysisAnalysis

Analysis Of HeightAnalysis Of Height 定理:定理: NN 个结点的个结点的 SBTSBT 的最坏深度为最大的最坏深度为最大

的的 HH 且满足 且满足 F[H] ≤ NF[H] ≤ N 。。 因此因此

Max_Height[N] ≤1.44logMax_Height[N] ≤1.44log22(N+1.5)(N+1.5)-1.33-1.33

AnalysisAnalysis

Analysis Of MaintainAnalysis Of Maintain

设 设 SD SD 为所有结点的深度之和为所有结点的深度之和

结论结论 (1)(1)在在 MaintainMaintain 的旋转后的旋转后 SDSD 总是递减总是递减

AnalysisAnalysis

Analysis Of MaintainAnalysis Of Maintain Case 1 : s[A]>s[R]Case 1 : s[A]>s[R]

SDSD 减少了 减少了 s[A]-s[R]s[A]-s[R] (( 正整数正整数 ))

TT

LL RR

AA BB DDCC

TT

LL

RR

AA

BB

DDCC

AnalysisAnalysis

Analysis Of MaintainAnalysis Of Maintain Case 2 : s[B]>s[R]Case 2 : s[B]>s[R]

SDSD 减少了减少了 s[B]-s[R]+1s[B]-s[R]+1 (( 正整数正整数 ))

TT

LL RR

AA DDCCBB

EE FF

TTLL

RRAA

DDCC

BB

EE FF

AnalysisAnalysis

Analysis Of MaintainAnalysis Of Maintain

结论(结论( 22 ))SD SD 总保持在 总保持在 O(nlogn)O(nlogn)

综合结论(综合结论( 11 )()( 22 )我们得到)我们得到

MaintainMaintain 的摊平时间复杂度 的摊平时间复杂度 = O( 1 )= O( 1 )

AnalysisAnalysis

Analysis Of OperationsAnalysis Of OperationsInsertInsert O(logn)O(logn)DeleteDelete O(logn)O(logn)FindFind O(logn)O(logn)RankRank O(logn)O(logn)SelectSelect O(logn)O(logn)

PredPred O(logn)O(logn)SuccSucc O(logn)O(logn)

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快

AdvantageAdvantage

I nsert 2, 000, 000 nodes wi th random val ues

SBT 7. 13AVL 8. 34

Treap11. 36

Randomi zedBST 13. 61

0

2

4

6

8

10

12

14

16

seco

nd

环境 : 512MbPentium M 1.6G

AdvantageAdvantage

Perform 2, 000, 000 operati ons of 66% i nserti onand 33% del eti on wi th random val ues

SBT 5. 59

Randomzi edBST 10. 47

AVL 7. 42

Treap8. 86

0

2

4

6

8

10

12

seco

nd

环境 : 512MbPentium M 1.6G

AdvantageAdvantage

Perform 2, 000, 000 operati ons of 20% i nserti on, 10% del eti on and 60% query wi th random val ues

SBT 3. 39

Randomi zedBST 6. 21

AVL 4. 21

Treap5. 67

0

1

2

3

4

5

6

7

seco

nd

7

环境 : 512MbPentium M 1.6G

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高

AdvantageAdvantage

插入 插入 2,000,000 2,000,000 个关键字随机的结点个关键字随机的结点

类型 SBT AVL TreapRandomized BST

SplayPerfect BST

平均深度 19.24 19.33 26.51 25.53 37.20 18.95

高度 24 24 50 53 78 20

旋转次数 157万

140万

399万 400 万 2515 万 ?

AdvantageAdvantage

插入 插入 2,000,000 2,000,000 个关键字有序的结点个关键字有序的结点

类型 SBT AVL TreapRandomized BST

SplayPerfect BST

平均深度 18.95 18.95 25.7 26.29 999999.5 18.95

高度 20 20 51 53 1999999 20

旋转次数 200万

200万

200万 200 万 0 ?

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高3.3. 调试易调试易

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高3.3. 调试易调试易4.4. 代码短代码短

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高3.3. 调试易调试易4.4. 代码短代码短5.5. 空间少空间少

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高3.3. 调试易调试易4.4. 代码短代码短5.5. 空间少空间少6.6. 功能强功能强

AdvantageAdvantage

七大优点七大优点1.1. 速度快速度快2.2. 性能高性能高3.3. 调试易调试易4.4. 代码短代码短5.5. 空间少空间少6.6. 功能强功能强7.7. 应用广应用广

AdvantageAdvantage

在信息学竞赛中的应用在信息学竞赛中的应用

1.1. Happy Birthday(NOI2006)Happy Birthday(NOI2006)2.2. 郁闷的出纳员郁闷的出纳员 (NOI2004)(NOI2004)3.3. 营业额统计营业额统计 (HNOI2002)(HNOI2002)4.4. 宠物收养所宠物收养所 (HNOI2004)(HNOI2004)

…………

感性与理性中螺旋前进感性与理性中螺旋前进

探索历程探索历程

IfIf s[left[t]]>s[right[t]] s[left[t]]>s[right[t]] thenthen right_rotate(t) right_rotate(t) 简 单简 单

效果不好,不一定效果不好,不一定能降低平均深度能降低平均深度

IfIf s[left[left[t]]]>s[right[t]] s[left[left[t]]]>s[right[t]]then then right_rotate (t)right_rotate (t)能降低平均深度。可能这是解能降低平均深度。可能这是解决有序和随机数据的最好方法决有序和随机数据的最好方法

效果不好,不一定效果不好,不一定能降低平均深度能降低平均深度

IfIf s[left[t]]>s[right[t]] s[left[t]]>s[right[t]] thenthen right_rotate(t) right_rotate(t) 简 单简 单

IfIf s[left[left[t]]]>s[right[t]] s[left[left[t]]]>s[right[t]]then then right_rotate (t)right_rotate (t)能降低平均深度。可能这是解能降低平均深度。可能这是解决有序和随机数据的最好方法决有序和随机数据的最好方法

依赖数据.依赖数据.对于人字形数据,BST,BST会退化成会退化成 O(N)O(N) 深深

度度

IfIf s[left[t]]>s[right[t]] s[left[t]]>s[right[t]] thenthen right_rotate(t) right_rotate(t) 简 单简 单

效果不好,不一定效果不好,不一定能降低平均深度能降低平均深度

依赖数据.对于人依赖数据.对于人字形数据,BST字形数据,BST会退化成会退化成 O(N)O(N) 深深

度度

添加添加If If s[right[left[t]]]>s[right[t]]s[right[left[t]]]>s[right[t]]then then left_rotate (left[t])left_rotate (left[t]) right_rotate (t)right_rotate (t)

效果不好,不一定效果不好,不一定能降低平均深度能降低平均深度

IfIf s[left[left[t]]]>s[right[t]] s[left[left[t]]]>s[right[t]]then then right_rotate (t)right_rotate (t)能降低平均深度。这应该是解能降低平均深度。这应该是解决有序和随机数据的很好方法决有序和随机数据的很好方法

时间复杂度时间复杂度不容易分析不容易分析

IfIf s[left[left[t]]]>s[right[t]] s[left[left[t]]]>s[right[t]]then then right_rotate (t)right_rotate (t)能降低平均深度。可能这是解能降低平均深度。可能这是解决有序和随机数据的最好方法决有序和随机数据的最好方法

依赖数据.对于人依赖数据.对于人字形数据,BST字形数据,BST会退化成会退化成 O(N)O(N) 深深

度度添加添加If If s[right[left[t]]]>s[right[t]]s[right[left[t]]]>s[right[t]]then then left_rotate (left[t])left_rotate (left[t]) right_rotate (t)right_rotate (t)

依赖数据.对于人依赖数据.对于人字形数据,BST字形数据,BST会退化成会退化成 O(N)O(N) 深深

度度

添加添加If If s[right[left[t]]]>s[right[t]]s[right[left[t]]]>s[right[t]]then then left_rotate (left[t])left_rotate (left[t]) right_rotate (t)right_rotate (t)

探索历程探索历程 在此感谢在此感谢

我的英语老师我的英语老师 FionaFiona

复旦大学的姚子渊复旦大学的姚子渊

香港大学的麦原和 香港大学的麦原和 Professor Golin Professor Golin

附附

想获得更详尽的内容,请参考想获得更详尽的内容,请参考我的论文我的论文。。

InsertionInsertion Simple-Insert (t,v)Simple-Insert (t,v)1.1. IfIf t=0 t=0 thenthen2.2. t←NEW-NODE(v)t←NEW-NODE(v)3.3. ElseElse4.4. s[t] ←s[t]+1s[t] ←s[t]+15.5. IfIf v<key[t] v<key[t] thenthen6.6. Simple-Insert(left[t],v)Simple-Insert(left[t],v)7.7. ElseElse8.8. Simple-Insert(right[t],v)Simple-Insert(right[t],v)9.9. Maintain (t,vMaintain (t,v≥key[t]≥key[t]))

DeletionDeletion

为了方便,我增加了为了方便,我增加了 DeleteDelete 的功能:的功能:

如果没有要删除的点就删除最后搜索到的如果没有要删除的点就删除最后搜索到的结点。结点。

DeletionDeletion1.1. IfIf s[t]≤2 s[t]≤2 thenthen2.2. record←key[t]record←key[t]3.3. t←left[t]+right[t]t←left[t]+right[t]4.4. exitexit5.5. s[t] ←s[t]s[t] ←s[t] -- 116.6. IfIf v=key[t] v=key[t] thenthen7.7. Delete(left[t],v[t]+1)Delete(left[t],v[t]+1)8.8. Key[t] ←recordKey[t] ←record9.9. Maintain(t,true)Maintain(t,true)10.10.ElseElse ifif v<key[t] v<key[t] thenthen11.11. Delete(left[t],v)Delete(left[t],v)12.12. ElseElse 13.13. Delete(right[t],v)Delete(right[t],v)14.14. Maintain(t,v<key[t])Maintain(t,v<key[t])

DeletionDeletion

其实结合其实结合 SBT-InsertSBT-Insert 地使用地使用 Simple-DelSimple-Deleteete 时间复杂度仅仅是时间复杂度仅仅是 O(log n*)O(log n*) 。其中。其中 nn** 是总的插入次数。是总的插入次数。

Simple-DeleteSimple-Delete 不仅更简单而且常数非常不仅更简单而且常数非常小。小。

ff

TT

LL RR

AA BB DDCC

TT

LL RR

AA DDCCBB

EE FF

TT

LL RR

AA BB DDCC

TT

LL RR

AA BB DDCC

TTLL

RRAA BB

DDCC

TT

LL

RR

AA

BB

DDCC

TT

LL RR

AA DDCCBB

EE FF

TT

LL RR

AA DDCCBB

EE FF

TT

LL RR

AA DDCCBB

EE FF

TT

LL

RR

AA

DDCCBB

EE FF

TT

LL

RR

AA

DDCC

BB

EE

FF

TT

LL

RR

AA

DDCC

BB

EE

FF

TT

LL

RR

AA

DDCC

BB

EE

FF

TT

LL RR

AA DDCC

BB

EE

FF

TTLL

RRAA

DDCC

BB

EE FF

TTLL

RRAA

DDCC

BB

EE FF

插插入入人人字字形形数数据据后后退退化化的的

SBT V2.0SBT V2.0

TT

LL RR

AA BB

TT

LL RR

AA BB

TT

LL

RR

AA

BB