数据结构与算法之B树,B+树总结

对搜索之总结:

数据杂乱无规律———>线性搜索    O(n)

数据已序——->二分查找      O(logn),最差情况下退化成单支树O(n)

二叉排序树,和二分查找一样    O(logn),最差情况成斜树,O(n)

AVL树/红黑树———–>O(logn)

 

引入B树的背景:

    数据保存在磁盘上,若数据量大不能全部加载到内存中去的话,为了访问所有的数据,减少对外存磁盘的访问次数,提高效率.就需要一种新的数据结构适合外查找的树,来提高I/O时间,降低树的高度,就是B树.

 

B树是如何做到减少内存与外存交换数据的次数的呢?

    我们的外存,比如说硬盘,是将所有的信息分割成相等大小的页面,每次硬盘读写的都是一个或多个完整的页面,对于一个硬盘来说,一页的长度可能是211到214个字节.

    在一个典型的B树应用中,要处理的硬盘数据量很大,因此无法一次全部装入内存中.因此我们会对B树进行调整,使得B树的阶数与硬盘存储的页面大小匹配.

    比如说一颗B树的阶为1001,(即1个节点包含1000个关键字)高度为2,它就可以存储超过10亿个关键字,我们只要让根节点持久的保留在内存中,那么在这颗树上,寻找某一个关键字至多需要两次硬盘的读取即可.

    通过这种方式,在有限内存的情况下,每一次磁盘的访问我们都可以获得最大数量的数据.由于B树的每个节点可以具有比二叉树多得多的元素,所以与二叉树的操作不同,它们减少了必须访问节点和数据块的数量,从而提高了性能.可以说,B树就是为了为内外存的数据交互准备的.

 

 B 树(也称B-树):B树是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例.结点最大的孩子数目称为B树的阶,因此,2-3树是3阶B树,2-3-4树是4阶B树.

一个m阶的B树具有如下的属性:

1)如果根节点不是叶节点,则其至少有两颗子树.

2)每一个非根结点至少有M/2个孩子,至多有M个孩子.

    每一个非根结点至少有M/2-1个关键字,至多有M-1个关键字.并且以升序排列.

4)所有叶子节点都在同一层上

5)key[i]和key[i+1]之间的孩子结点的值介于key[i]和key[i+1]之间.

 

B树的缺陷就是遍历,当我们已中序遍历B树时,就必须在硬盘页面之间进行多次访问.而且我们每次经过结点遍历时,都会对结点中的元素进行一次遍历,这就非常的糟糕.

 

    为了能够解决所有元素的遍历基本问题,我们在原有的B树结构基础上,加入新的元素组织方式,B+树.

 

    一颗m阶的B+树和m阶的B树的差异在于:

1)有n颗子树的节点中包含n个关键字

2)所有叶子结点包含全部关键字的信息,叶子节点中有一个链指针指向含这些关键字记录,叶子结点本身依关键字的大小自小而大顺序链接.

3)所有分支结点可以看成是索引,节点中仅含有其子树中的最大(或最小)关键字.

 

 

B+树和B树的区别:

1)适合文件索引系统.

2)B+树只有在叶子节点才能命中,所以插入和删除都是在叶子节点上进行而已.

3)适合于范围查找,找到待查找的关键字,然后从最小关键字从小到大进行顺序查找,不经过分支结点,而是沿着指向下一叶子节点的指针就可以遍历所有关键字.

 

 

B树和B+树的相关应用:

目前大部分数据库系统及文件系统都采用B树和B+树作为索引结构.

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上.这样的话,索引查找的过程中就要产生磁盘I/O消耗,相比于内存存取 I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度.

本文大部分内容参考自<<大话数据结构>>.

点赞