二分查找法(binary search)也成为折半查找法。用来查找一组有序的记录组中的某一记录。算法
基本思想是:将记录按有序化(递增或递减)排列,在查找过程当中采用跳跃式方法查找,即先以有序数列的中点位置为比较对象,若是要找的元素值小于该中点元素,则将待查询列缩小为左半部分,不然为右半部分。经过一次比较,将查询区间缩小一半。markdown
若有5,10,19,21,31,37,42,48,50,52这10个数,要查48这个数,其查找过程:数据结构
从图看,用了3次就找到了48这个数。若是是顺序查找,则须要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次。spa
在最坏的状况下,顺序查找的次数为10,而二分查找法为4设计
B+树是经过二叉查找树,再由平衡二叉树,B树演化而来。3d
二叉查找树中定义:左子树的键值老是小于根的键值,右子树的键值老是大于根的键值。所以能够经过中序遍历获得键值的排序输出指针
若想最大性能的构造一颗二叉查找树,须要这颗二叉查找树是平衡,从而引出了新的定义-----平衡二叉树,或称为AVL树。code
平衡二叉树定义:首先复合二叉查找树的定义,其次必须知足任何节点的两个子树的高度最大差为1.orm
平衡二叉树的查询速度很快,可是维护一颗平衡二叉树的代价很大,一般来讲,须要1次或屡次左旋和右旋来获得插入或更新后树的平衡性。以下所示:
B+树和二叉树、平衡二叉树同样都是经典的数据结构。
B+树由B树和索引顺序访问方法(ISAM,这就是MyISAM引擎最初参考的数据结构)演化而来,实际中已经没有使用B树的状况了。
B+树是为磁盘或其余直接存储辅助设备设计的一种平衡查找时。
B+树中,全部记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行链接。
以下:其高度为2,每页存放4条记录,扇出(fan out)为5。全部记录都在叶子节点上,而且是顺序存放的。
B+树的插入必须保证插入后叶子节点中的记录依然排序,同时须要考虑插入到B+树的三种状况,每种状况都会致使不一样的插入算法。以下所示:
一、以下图这颗B+树,若用户插入28这个值,发现当前叶子页leafPage和IndexPage索引页都没有满,直接插入就行。
图(1)
图(2)
二、从上图接着插入70这个键值,这时原来的leafPage已经满了,可是IndexPage尚未。这时插入leafPage后的状况为50、5五、60、6五、70,并根据中间值60来拆分叶子节点,可得下图。
图(3)
为了保持平衡对于新插入的键值可能须要作大量的拆分页(split)操做。由于B+树结构主要用于磁盘,也拆分意味着磁盘操做,因此应该在可能的状况下尽可能减少页的拆分操做。所以B+树会提出平衡二叉树的旋转(Rotation)功能。
旋转发生在leafPage已满,可是其左右兄弟节点没有满的状况下。这时B+树不会急于去拆分页操做,而是将记录移到所在页的兄弟页节点上,一般状况下,左兄弟会被首先检查用来作旋转操做。若如此,插入70应该左旋为:
图(4)
三、最后插入95,这时复合第三种状况,即leafPage和IndexPage都满了,这时须要作两次拆分
图(5)
B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值。
B+树的删除操做一样必须保证删除后叶子节点中的记录依然排序,同插入同样,B+树删除操做一样须要考虑如下三种状况:
一、根据图(5)的B+树来进行删除。首先删除键值为70的记录:
接着删除键值为25的记录,可是该值仍是IndexPage中的值,所以在删除LeafPage中的25后,还应将25的右兄弟节点28更新到PageIndex中,如图:
最后删除60这个键值。删除LeafPage中键值为60的记录后,Fill Factor小于50%,这时须要作合并操做,一样,在删除IndexPage中相关记录后须要作IndexPage的合并操做。