[关闭]
@w1024020103 2017-04-11T19:16:17.000000Z 字数 1857 阅读 753

Lecture 22: Balanced Search Trees

CS61B


2-3-4 and 2-3 Trees (a.k.a. B-Trees)

先是指出现有树的不足:

5.jpg-137.4kB

为了解决这个问题,solution是永远不要增加新的树叶:

7.JPG-48.5kB

但也带来了新的问题,怎么添加新元素呢?

这个问题的solution是硬塞:

8.JPG-53.5kB

但这样又带来新的问题,树叶变得too juicy, 也就是每个Node里有太多元素,满得要溢出来,并且有的结点意义不明:

10.JPG-66.9kB

这个问题的solution是,为每个结点所能容纳的元素数设置上限,比如3;多出来的就移给它的父树枝,然后把子树枝里面含有较多元素的split开来:

9.JPG-72.5kB

下面是例子,可以做看看自己是否理解insert该怎么split:

11.JPG-57.8kB

下面又有一个问题,如果根树枝的元素数量达到上限了,该怎么办?

5.jpg-89.5kB

答案没问题:

13.JPG-53.2kB

这里有一个结论:splitting trees have perfect balance.
就是通过这种分割方式得到的树都是perfect balanced

Perfect Balanced tree的定义是从任何一个分支端点走到根结点,都是一样的长度:

14.JPG-40.2kB

按照定义,这也是perfectly balanced tree:

image_1bde6vcdc1n3f11ipj72g401j164p.png-89.8kB

Spiltting tree的高度介于Logm(N) 跟log₂(N)之间,
每个Node至少2个children,最多Height = log₂(N)很好理解,

15.JPG-108.2kB

splitting tree很形象,但是它们的名字是叫B-trees, a B-tree of order M = 4也叫做2-3-4 tree或者2-4tree,这个名字代表每一个Node能有的元素上线数:

15.JPG-108.2kB

Tree Rotation

先看下rotate的例子:

18.JPG-71.2kB

自己试着rotate一个:

5.jpg-87.1kB

答案没毛病:

18.JPG-71.2kB

下面有一个结论,现在还没有给出证明:任何一个不平衡的数,通过一系列的rotate,都可以得到一个平衡的树

19.JPG-76.4kB

Red-Black Trees

我们想用一个Binary Tree来代表一个2-3 Tree,因为2-3 Tree有一些令人恼火的特性:代码很tricky, 每个Node的children数量是变量……

于是,我们用一个glue-link来代表一个3结点:

20.JPG-96.4kB

Left-leaning Red Black Tree(LLRB)的定义:

21.JPG-76.8kB

试着自己画一个LLRB:

5.jpg-60.4kB

跟答案稍有出入,

22.JPG-47.4kB

at first I thought they are both correct,仔细一看,我的LLRB没有满足LLRB的第三个条件:Red links lean left,所以还是不正确,修改:

23.jpg-67.3kB

slides说2-3 tree和LLRB之间有Isometry, 这个单词是等距的意思,我理解为2-3 Tree和LLRB tree可以相互转换:

24.JPG-74.6kB

那么为了保持这种2-3 tree跟LLRB tree之间的对应关系,类比于2-3 tree, 在LLRB tree中Insert新元素的时候,是应该用red link 还是black link呢?

25.JPG-34.9kB

答案很简单,在2-3 tree里我们insert时,首先肯定是塞满一个node, 也就是让新元素glue link to 那里本来就有的元素(黏在一起),在红黑树里就要用red link:

26.JPG-47.3kB

转换成红黑树的时候还会遇到一个问题,也是我自己刚刚遇到的,就是我们的red link有可能是右倾而不是左倾的:

27.JPG-51.3kB

solution很简单,rotate即可。

保持isometry的三种重要情况:

第一种情况:two red children:
在2-3 tree里我们会遇到一种情况,向一个Node中Insert元素的时候,达到元素数量的cap,这时候我们会split the node,然后 send up其中一个元素to parent node,红黑树中也有相对应的情况,就是一个Node周围有两条red links,这时候怎么办呢?

28.JPG-61.4kB

solution是Flip colors, 这里有一些magic, 但只要调换颜色就可以。

第二种情况:two reds-in-a-row
这种情况先rotate一下变成two red children的第一种case,接下来相同方法处理:

30.JPG-59.6kB

第三种情况是red left red right:
这种情况的solution是先rotate成case two: two reds-in-a-row;再rotate成case one: two red children来处理:

31.JPG-68.9kB

一言以蔽之,类比于2-3 tree, 我们的LLRB tree 保持isometry的方法就是Tree rotations and Color Flips!

32.JPG-75.7kB

Summary:

34.JPG-103.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注