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. pycharm 注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  2. Spring概念

    1.控制反转IOC:即生成对象,相当于new的功能,用IOC有利于维护. 2.依赖注入DI:即给属性赋值,相当于JavaBean的setter方法. 3.面向切面方程AOP:使得各个切面和目标类完全松 ...

  3. WeedFS依赖库 0.6.1

    WeedFS依赖库 版本 0.6.1 =======================================================================glog====== ...

  4. linux使用grep和find查找内容

    1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...

  5. AndroidStudio导入项目一直卡在Building gradle project info最快速解决方案

    AndroidStudio导入项目一直卡在Building gradle project info,实际上是因为你导入的这个项目使用的gradle与你已经拥有的gradle版本不一致,导致需要下载该项 ...

  6. mysql 存储过程 游标 判断游标是否为空

    BEGIN DECLARE id long; DECLARE Done INT DEFAULT 0; DECLARE cashamount DECIMAL(10,2) DEFAULT 0.00; DE ...

  7. 内存工具类:MemoryManager

    个人学习,仅供参考! package com.example.administrator.filemanager.utils;import android.app.ActivityManager;im ...

  8. 发现 git忽略没用

    git rm --cached GuoJiWeb/Properties/PublishProfiles/Profile1.pubxml

  9. 转-servlet 获取 post body 体用流读取为空的问题

    目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式.在Java servlet或者springmvc中可以通过如下代码来获取并图片通过流方式传输 ...

  10. Jquery遍历选中的input标签

    $("input[name='chkAgent']:[checked]").each(function () { alert($(this).attr("value&qu ...