B-tree&B+tree

  B-tree,B是balance,一般用于数据库的索引。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。而B+tree是B-tree的一个变种,大名鼎鼎的MySQL就普遍使用B+tree实现其索引结构。

  那数据库为什么使用这种结构?

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

  为了达到这个目的,磁盘按需读取,要求每次都会预读的长度一般为页的整数倍。而且数据库系统将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。并把B-tree中的m值设的非常大,就会让树的高度降低,有利于一次完全载入。

m-way查找树

  首先介绍一下m-way查找树,顾名思义就是一棵树的每个节点的度小于等于m。

  故,它的性质如下:

  1. 每个节点的键值数小于m
  2. 每个节点的度小于等于m
  3. 键值按顺序排列
  4. 子树的键值要完全小于或大于或介于父节点之间的键值

B-tree

  B-tree是一种平衡的m-way查找树。

  B-tree利用多个分支(称为子树)的结点,减少获取记录时所经历的结点数,从而达到节省存取时间的目的。

  

  一棵度为m的B-tree应满足的性质:

  1. 每个结点的子结点个数≤m;
  2. 根结点若不是叶子结点,它至少有两个子结点
  3. 除根和叶子结点外,每个结点的子结点个数≥ [m/2]
  4. 所有的叶子结点都出现在同一层,而且不带有信息
  5. 非叶子结点若具有j+1个子结点,那么它包含j个关键字(其中,j≤m-1)

  B-树的非叶子结点的结构形式:

ki (1≤i≤j)是关键字,所有关键字的值是唯一的;pi (0≤i≤j)是指向该结点的子结点的指针

例如图中的P1,它指向的子树的关键字应该大于k1,小于k2

B-树的查找

       在给定的m阶B-树中查找一个给定值v相等的关键字,必须从根结点开始进行查找,一般采用二分查找

B-tree的插入 

  1.   插入的节点少于M-1个键值,则直接插入。
  2.   插入的节点的键值已等于m-1,则将此节点分为二,因为一棵m的B-tree,最多只能有m-1个键值

B+tree

  B+树是B-树的变体。

  有几点不同的地方:

  1. 非叶子结点的子树指针与关键字个数相同
  2. 为所有叶子结点增加一个链指针
  3. 所有关键字都在叶子结点出现

 

参考

http://blog.csdn.net/hguisu/article/details/7786014

http://blog.sina.com.cn/s/blog_6776884e0100ohvr.html

http://baike.baidu.com/link?url=8Au1iocebretZtJN2E6JcIolkM79PDwQ22dJEESfntDvYUXHKfZ45s4zcd4PoCjm


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-20 09:52:44

B-tree&B+tree的相关文章

算法:zoj 3201 Tree of Tree(树形背包dp)

题意 给一棵节点带权的树,找到一个有k个节点的子树,求这个子树的最大权值 思路 树形 dp+背包. f(i, j) 表示以i为根节点的有j个节点子树的最大权值 然后对i的每个子节点做分组背包, 因为对于i的每个儿子,可以选择分配 1,2,3...j-1个节点给它 f(i, j) = max{ max{f(i, j-p) + f(v, p) | 1<=p<j} | v是i的儿子节点} ans = max{ f[i][k] | 0<=i<n && i 子树节点个数>

B-tree/B+tree/B*tree

           B~树                1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树 (Red-Black Tree ),B-tree/B+-tree/ B*-tree(B~Tree).前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然对查找效率是有所提高的:还有一个实际问题:就是大规模数据存储中,实现索引查询

2000条你应知的WPF小姿势 基础篇&lt;45-50 Visual Tree&amp;Logic Tree 附带两个小工具&gt;

原文:2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follo

UVa 112 Tree Summing (scanf()去空格&amp;amp;递归&amp;amp;二叉树遍历)

112 - Tree Summing Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48 Background LISP was one of the earliest high-level programming languages and, with FORTRAN, is one o

Docker export import containers, save load images, commit containers, docker images tree

本文讨论一下与docker镜像相关的几个接口. 制作镜像相关 :  使用dockerfile制作一个sshd镜像 http://blog.163.com/digoal@126/blog/static/1638770402014102711413675/ 从container制作镜像(使用docker commit) http://blog.163.com/digoal@126/blog/static/1638770402014923112924656/ 制作base镜像 http://blog.

纸上谈兵: 伸展树 (splay tree)[转]

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每次搜索的复杂度为n的量级.AVL树通过动态平衡树的深度,单次搜索的复杂度为log(n) (以上参考纸上谈兵 AVL树).我们下面看伸展树(splay tree),它对于m次连续搜索操作有很好的效率.   伸展树会在一次搜索后,对树进行一些特殊的操作.这些操作的理念与AVL树有些类似,即通过旋转,

DHTMLX Tree中文开发指导

 专业版1.6下载地址(CSDN)  http://download.csdn.net/source/1388340 版本号:dhtmlxTree v.1.6 Professional edition build 71114   最近开发项目使用到了dhtmlXtree做权限设置,看了网上相关的中文资料很少,就把官方的资料翻译了下,一共分2部分,API可以参考官方文档:http://dhtmlx.com/docs/download.shtml   效果图如下(三态树):   dhtmlXTree

Linux 命令(文件和目录管理 - tree)

简述 使用 tree 命令以树状图递归的形式显示各级目录,可以方便地看到目录结构. 简述 安装 tree 命令 命令介绍 命令选项 使用范例 安装 tree 命令 大部分 Linux 中默认没有安装 tree 命令,以 CentOS 7.x 为例: [wang@localhost ~]$ tree bash: tree: 未找到命令... 切换至 root,进行安装: [root@localhost ~]# yum install tree 命令介绍 命令名称 tree 基本语法 tree [-

s2sh extjs tree checkbox 怎么传参啊

问题描述 打开界面前有个参数Aid extjs 如何通过这个参数获得tree 拿到这个树后(带checkbox的) 更改后 如何把被选中的tree id 传给action 是不是需要 loader.on什么的 怎么写Ext.onReady(function() {Ext.BLANK_IMAGE_URL = "/dtjcsy/pages/js/ext/resources/images/default/s.gif";var Tree= Ext.tree;var tree = new Tre

关于EXT tree的加载选中状态

问题描述 EXT不太熟悉,我现在EXT是加载一颗整树,我现在想做一个在树加载完成后,把一些节点默认选中,varloader=newResoft.wcm.OrgTreeLoader({dataUrl:'${pageContext.request.contextPath}/module/orgTree/subTree.do',requestMethod:'GET'});loader.on("beforeload",function(treeLoader,node){treeLoader.b