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的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  3. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  4. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  7. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  8. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  9. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

  10. Tree树节点选中及取消和指定节点的隐藏

    指定节点变色 指定节点隐藏 单击节点 未选中则选中该节点 已选中则取消该节点 前台: 1.HTML <ul id="listDept" name="listDept ...

随机推荐

  1. 区块 Blocks

    Structure / Blocks / Demonstrate block regions

  2. 稳定灵活的 HTML 列式布局

    主要特点: 所有列轻松实现相同高度 兼容性极高 ------------------------------------------------ 代码 ------------------------ ...

  3. rabbitMQ学习(一)

    一般模式 服务端: import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabb ...

  4. findViewById返回null

    Q:findViewById返回null? A: 代码逻辑错误: 最终,发现错误竟然是在layout文件中把android:id写成了android:name. android:name=" ...

  5. MySQL分区表管理

    RANGE,LIST分区管理 1:为未分区表创建分区 ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2; 2:删除某个分区的数据 ALTER TAB ...

  6. diamond专题(一)– 简介和快速使用

     (转自 http://blog.csdn.net/zh_winer/article/details/50395024) 一.概况 diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单 ...

  7. oracle建立数据库连接

    除了全库拷贝,这个应该是oracle两个数据库之间进行数据迁移最快的方法了. CREATE PUBLIC DATABASE LINK zhengshi CONNECT TO 用户名 IDENTIFIE ...

  8. document.createElement()方法

    document.createElement()是在对象中创建一个对象,主要和appendChild() 方法或者insertBefore() 方法联合使用. appendChild() 方法在节点的 ...

  9. 问题1:Mybatis 中 Signature中的参数args 问题2:MetaObject中 forObject方法中的参数

    1.@Intercepts({@Signature(type =StatementHandler.class, method = "prepare", args ={Connect ...

  10. 手动部署servlet

    1.编写servlet,在tomcat\webapps目录下新建文件Test,Test目录如下 Test | classes   web.xml | test01 | Servletfirst.jav ...