二分查找法(binary search)也称为折半查找法,用来查找一组有序的记录数组中的某一记录,其基本思想是:将记录按有序化(递增或递减)排列,在查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半
演示案例 如有5、10、19、21、31、37、42、48、50、52这10个数,现在要从这10个树中查找48这条记录,其查找过程如下: 从上图可以看到,用来3此就查找到了。如果是顺序查找,则需要8次。如果要查找5这条记录,顺序查找只需1次,二分查找法需要4次 对于上面10个数来说,平均查找次数为(1+2+3+4+5+6+7+8+9+10)/10=5.5次。二分查找法为(4+3+2+4+3+1+4+3+2+3)/10=2.9次。在最坏的情况下,顺序查找的次数为10,而二分查找的次数为4
查找复杂度 查找5这个节点: 那么先从跟查找,然后再查找左子树3,然后再查找右子树5,最终找到。一共找了3次 如果通过中序遍历的话也需要3次 查找8这个节点: 先找6,再找7,再找8,最终找到。一共找了3次 如果通过中序遍历的话需要6次 总结: 二叉树的平均查找次数为(3+3+3+2+2+1)/6=2.3次 中序遍历的查找次数为(1+2+3+4+5+6)/6=3.3次 因此,二叉搜索树的平均查找速度较快
单旋转 在上图所示的平衡二叉搜索树中插入节点9,那么就不是平衡的了,因为节点7的的左右子树高度差为2 因此需要做一次单旋转来回到平衡状态
双旋转 在上图所示的平衡二叉搜索树中插入节点3,那么就不是平衡的了,因为节点2的的左右子树高度差为2 因此需要做双旋转来回到平衡状态
B+树的插入操作 B+树的插入必须保证插入后叶子节点中的记录依然排序,同时需要考虑插入到B+树的三种情况,每种情况都可能会导致不同的插入算法。如下图所示: Leaf Page未满、Index Page未满的插入 对于上面那张B+树所示,若用户插入28这个键值,因为Leag Page和Index Page都未满,因此可以直接插入,得到下图所示结果 Leaf Page已满、Index Page未满的插入 接着上图,我们再插入70这个键值,此时Leag Page已满但是Index Page未满,插入之后Leaf Page的情况为:50、55、60、65、70,此时中间节点为60,以60来拆分叶子节点 此时根据以下规则插入: 查分Leaf Page 将中间的节点(60)放入到Index Page中 小于中间节点的记录(50、55)放左边 大于或等于中间节点的记录(65、70)放右边 最终的结果过如下图所示(备注:下图没有在各叶子节点加上双向链表指针,不过与上图一样,它是存在的): Leaf Page已满、Index Page已满的插入 接着上图,我们插入键值95,此时Leag Page、Index Page都已满,因此需要做两次拆分,执行步骤如下: 拆分Leaf Page 小于中间节点的记录放左边 大于或等于中间节点的记录放右边 拆分Index Page 小于中间节点的记录放左边 大于中间节点的记录放右边 中间节点放入上一层Index Page
旋转操作 从上面可以看到,不论B+树如何变化,最终都会平衡。因为B+树会不断进行拆分页操作。但是B+数主要用于磁盘,页的拆分意味着磁盘的操作,所以应该在可能的情况下尽量减少页的拆分操作,所以B+树也提供了类似于平衡二叉树的旋转操作 原理: 旋转发生在Leaf Page已满,但是其左右兄弟节点没有满的情况下 这时B+树并不会急于去做拆分页的操作,而是将记录移动到所在页的兄弟节点上 在通常情况下,左兄弟会被首先检查用来做旋转操作 再来看看上面“Leag Page未满、Index Page未满的插入”,如下图所示: 若插入键值70,其实B+树并不会急于拆分叶子节点,而是做旋转操作,得到下图所示的操作
原理:
B+树的删除操作 B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值 B+树的删除操作同样必须保证删除后叶子节点中的记录依然排序 同插入一样,B+树的删除操作同样需要考虑下面的3种情况,与插入不同的是,删除根据填充因子的变化来衡量 表中删除的第一种情况(删除节点为叶子节点): 例如根据上图,我们要删除70这条记录。因为70为叶子节点,因此直接删除这个叶子节点即可 最终的结果如下 表中删除的第一种情况(删除节点非叶子节点): 接着上图,我们删除键值为25记录,但是该值还是Index Page中的值,因此删除之后要以其右兄弟节点(2)来代替。最终的结果如下 表中删除的第一种情况 接着上图,我们要删除60这个节点 删除Leaf Page中键值为60的记录后,File Factor小于50%,这时需要做合并操作,同样,再删除Index Page中相关记录后需要做Index Page的合并操作,最终的结果如下: