CS61B - Lec 22 - B Tree


上节课讲了二叉树,但是并没有讲二叉树是怎样建立的。如果不规定一种建立方式,那么有可能建出一个极高的二叉树,极限情况下会变成链表,失去了二叉树的意义。这节课主要为了优化这个问题,提出一种新的树形结构——B Tree。

Height, Depth and Performance

在这里插入图片描述
树的高度决定了找到某节点的最长时间,上图高度就是k - s,不算k本身,为4。
平均深度决定找到某一结点需要的平均时间。
在这里插入图片描述
上图为一个插入数据的顺序影响二叉树的高度的例子。如果从小到大插入数据,则数据会依次插入父节点的右侧,形成一个链表,这时的高度最大,为O(N)。当按照二分法的顺序进行插入,就能得到最完美的二叉树,高度是O(log(N))。

但是现实世界中插入数据的顺序是确定的么?肯定不是,不能要求每次插入的数据都符合二分法的顺序。

首先考虑随机插入的情况:
在这里插入图片描述
经证明,随机插入时树的高度为Θ(log(n)),据说证明很复杂。平均深度为Θ(log(n))。

但是并不是所有插入都是随机的。
在这里插入图片描述
比如需要按时间顺序来插入,就成了典型的从小到大,会插成链表。于是要定义插入的方式来解决。

2-3-4 and 2-3 Tree Operations(B-Trees)

在这里插入图片描述
防止树的高度过高,那么不往底部继续添加数据高度就不会变了对不对?那么加到哪里呢?
在这里插入图片描述
加到最后一行的叶子上?将此节点变得可以容纳多个数据,如上图,这样树的高度一直不会变。但明显很蠢,等于又造了个链表出来。
在这里插入图片描述
然后提出新的方案:设定节点最多容纳数据的数量,比如3,如果插入的数据数量超过三,则选择一个数据插入到父节点上。但是这样做有一个问题,那就是并不满足开始二叉树的定义,即大于右子树的所有值。如上图,选择17加入父节点,17就会大于右子树的16。怎样解决?
答案是变成3个children,加入一个中间节点。
在这里插入图片描述
在这里插入图片描述
继续加入20, 21。该节点数据数量大于3,选择19加入父节点,然后将18变到17, 19中间,20,21放在19的右边。(所以不是只能有三个children?)
在这里插入图片描述
继续加入25, 26。如图,右下角节点数据数量超过3,则将21加入父节点并更新位置。父节点的数量也超过3,将17加入爷节点(( ̄▽ ̄)"),再更新位置。这种数据结构就称之为B Tree。(意思可能是Balanced Tree,但Josh觉得叫Split Tree更合适一些)
可见,B Tree使树变得平衡了,leaf和root都不会变得太大,树的高度也不会太高。
当L=3时,B Tree也被称之为2-3-4 tree(见标题)。2-3-4的意思是每个节点容纳的子节点的数量。是不可能只有一个子节点的。

B-Tree Bushiness Invariants

在这里插入图片描述
由于B-Tree构造的规则,得到了两个Invariants。

  1. 所有的leaf(底层节点)距离source(顶部)的距离是相同的。
  2. 一个具有k个数据的节点拥有的子节点的数量一定是k+1

虽然不好证明,但是想一想肯定是对的。下面就分析复杂度了。

B-Tree Runtime Analysis

在这里插入图片描述
如图,B-Tree高度最高时,每个节点只有一个数据,则每个节点有两个子节点。计算得到树的高度是log(N)。
B-Tree高度最低时,每个节点有L个数据,则每个节点有L+1个子节点,计算得到树的高度是logL+1(N)。
因此,B-Tree 的Overall Height是Θ(log N)。(log随便换底)
在这里插入图片描述
计算好了高度,分析contain方法的复杂度很简单,为O(log N)
在这里插入图片描述
add也一样。

发布了20 篇原创文章 · 获赞 0 · 访问量 170

猜你喜欢

转载自blog.csdn.net/fourier_transformer/article/details/105455651