B-tree
2-3 Tree
二叉搜索树的每个节点只带有一个值,这个值将数据区间划分成两部分,值左边的部分(也就是小于这个值的数据)保存到节点的左子树,值右边的部分保存到节点的右子树。因此,每个非叶子节最多能够拥有两个子节点。
如果每个节点保存两个值,那么这两个值可以将数据区间划分成三部分,左边部分的数据保存在左子树,右边部分的数据保存在右子树,介于两个值之间的那部分数据保存在中间子树。也就是说,在一个节点保存两个值的情况下,这个节点有三个子节点。
节点可以存储1个或者2个值的搜索树,就是2-3树了。二叉搜索树的查找效率为O(h),h为树的高度。在最好的情况下(完全平衡),有N个节点的二叉搜索树的高度为h=log(N),但添加删除节点时二叉搜索树容易失去平衡,失去平衡后树的高度就会发生变化,最差情况下,树的高度为N。使用平衡算法来平衡二叉搜索树,又需要花费额外的开销。
2-3树在插入数据过程中,会自动平衡。二叉搜索树的新节点只能作为叶子节点添加,而添加叶子节点提高了增加树高度的概率;二叉搜索树的根节点一旦确定就不会再被修改,直观地想下,如果根节点的值在数据区间的两端,那么最终肯定会导致树的非常不平衡。另一方面,因为二叉搜索树的节点只能保存一个值,同2-3树可以最多保存2个值相比,即使在都完全平衡的情况下,2-3树的高度也要小。
2-3树插入新节点时,如果插入点已经存在2个值,那么它首先将新值和原来的2个值放在一起构成3个值的节点,然后将这三个值的中间值向上提到父节点, 而剩余的两个值变成了父节点的两个子节点(因为分别在中间值的左右两边)。父节点也做相同的处理,依次向上提,直到根节点, 如果根节点已经为2个值的节点,那么就会改变根节点的值。这种“将中间值向上提”的过程,实际就是自动平衡的过程。
2-3树的最差查找效率为lgN,最好查找效率为log3N,约等于0.631lgN。
本节主要参考浅谈算法和数据结构:平衡查找树之2-3树
B-tree
本节主要参考MySQL索引背后的数据结构及算法原理
B-tree的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
- Tree树节点选中及取消和指定节点的隐藏
指定节点变色 指定节点隐藏 单击节点 未选中则选中该节点 已选中则取消该节点 前台: 1.HTML <ul id="listDept" name="listDept ...
随机推荐
- Js获取图片原始宽高
如果我们页面看到的图片都是缩略图,那就需要做个图片点击放大效果,那么怎样获取图片的原始宽高呢?方法如下: //获取图片原始宽度 function getNaturalWidthAndHeight(im ...
- 获取iPhone 联系人列表,并且根据分析得到的姓名首字母进行排序
获取手机联系人以iOS9为分界点,大家都知道到了iOS9很多方法都更新了,好多接口都弃用,被新的接口代替.这Demo种有新旧两个接口,使用前判断当前iOS版本. 下面是Demo连接地址:Github的 ...
- 第六百零六天 how can I 坚持(应该是六百零六天吧)
找了个考研的借口,也是挺逗的,终于结束了,而且考的很渣. 最近发生了很多事,很快就要离开泛华了,放弃安逸,开始改变吧,其实感觉自己内心挺怂的,很怕改变,哎,这不像是有梦想,能成事的人应该有的. 还是想 ...
- 读《JavaScript DOM编程艺术》
国庆假期花了三四天看了这本书,书很薄,因为是入门书,干货也不是很多. 4. childNodes nodeType nodeValue firstChild lastChild childNodes返 ...
- 实数---Currency讲解
Currency 实际上是 Int64 的变体,Int64/10000 就是实际的值
- php用simplexml来操作xml
<?php$username = 'zhansan';if (!file_exists('001.xml')){ $fp = fopen('001.xml', 'w'); $xmlContent ...
- Java入门记(三):初始化顺序
初始化顺序的规则 1.在一个类的对象实例化时,成员变量首先初始化,然后才调用构造器,无论书写顺序.如果调用构造器前,没有显式初始化,那么会赋默认值. 这样做法的原因可以理解为:构造器执行时可能会用到一 ...
- eclipse连接外部tomcat进行debug
首先,在tomcat/bin目录下找到编辑catalina.bat,在 rem $Id: catalina.bat 1344732 2012-05-31 14:08:02Z kkolinko $rem ...
- nagios二次开发(五)---nagios和nagiosql的关系
根据对nagios和nagiosql的了解,笔者简要的将二者的关系粗略的梳理了一下,具体情况如下图所示: 从上面的关系图中可以看出,nagios与nagiosql共享了主机.主机组.服务.服务组等.c ...
- ajaxfileupload.js的简单使用
上传文件 未选择任何文件 引入 <script src="../javaScript/ajaxfileupload.js"></script> <bu ...