前面介绍的算法在最坏的情况下还是很糟糕。这次会介绍一种二分查找树并能保证无论如何构造它,他的运行时间都是对数级别的。理想情况下我们希望能够保持二分查找树的平衡性。但是,在动态插入中保证树的完美平衡的代价太高了。

2-3查找树

我们将一棵标准的二叉查找树中的节点成为2-节点(含有一个键和两条链接),现在我们引入3-节点,它含有两个键和三条链接。

查找

要判断一个键是否在树中,我们先将它和根节点中的键比较。如果它和其中任意一个相等,查找命中;否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归的递归查找。如果这个是空链接,查找未命中。

插入

树的平衡:
任何节点的左子树和右子树之间的高度差不能超过1。

上图中(a)是平衡的,(b)是不平衡的,很显然,一个完全不平衡的树,在做查找时,它就是线性级别的性能,而平衡的二叉树,同样的数据量,但有效利用了平衡性,它的查找性能则能降到对数级别。

而动态平衡要求的是要在插入是,时刻保持树的平衡性。

分为几种情况:

向2-节点中插入新键

若未命中的查找结束于一个2-节点,我们只要把这个2节点替换为一个3节点就可以了。

向一棵只有3-节点的树中插入新键

为了新键的插入,首先临时将新键存入该节点中,使之成为一个4-节点。然后很容易就将他转化为一棵由3个2-节点组成的2-3树。

向一棵父节点为2-节点的3-节点中插入新键

假设未命中的查找结束于3-节点,而他的父节点是2-节点。我们先像刚才一样构造一个临时的4-节点并将其分解,但此时我们不会为中键创造一个新的节点,而是将其移动至原来的父节点中。

向一棵父节点为3-节点的3-节点中插入新键

假设未命中的查找结束于一个父节点为3-节点的节点,我们再次和刚才一样构造一个临时的4-节点并分解它,然后将他的中键插入它的父节点中,但父节点也是一个3-节点,因此我们再用这个中键构造一个临时的4-节点,然后在这个节点上进行相同的变换,就这样一直向上不断分解临时4-节点并将中键插入到更高层的父节点。

分解根节点

构造二叉树

总结

尽管我们可以用不同的数据类型表示2-节点和3-节点,但是这种直白的表示方法实现大多数操作并不方便,因为需要处理的情况太多。我们需要维护两种不同类型的节点,将被查找的键和节点中的每个键进行比较,将链接和其他信息从一种节点复制到另一种节点,将节点从一种数据类型转换到另一种类型,等等。不仅需要大量的代码,而且产生的额外开销可能会使算法比标准二叉树更慢。

查找算法之平衡查找树相关推荐

  1. python 查找算法_七大查找算法(Python)

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...

  2. 数据结构之查找算法:折半查找

    查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...

  3. 查找算法:二分查找、顺序查找

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  4. 数据结构之查找算法:分块查找

    查找算法:分块查找 思维导图: 分块查找的定义: 如何分块: 如何查找: 代码实现: 查找效率: 思考: 思维导图: 分块查找的定义: 如何分块: 例: 如何查找: 1.先查找在哪块 2.然后查找块内 ...

  5. 数据结构之查找算法:顺序查找

    查找算法:顺序查找 思维导图: 顺序查找的定义: 顺序查找的代码实现: 顺序查找的性能: 思维导图: 顺序查找的定义: 顺序查找的代码实现: typedef struct { //查找表数据结构int ...

  6. 查找算法:插值查找算法实现及分析

    插值查找算法介绍 插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式key-arr[low]/arr ...

  7. 查找算法:折半查找算法实现及分析

    折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...

  8. 修改折半查找算法进行范围查找

    /*************************************** *修改折半查找算法进行范围查找  ***************************************/ # ...

  9. 二分查找算法(折半查找算法)

    二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...

最新文章

  1. Smart Crop,一种切除 PDF 扫描文档白边的新选择(工程篇)
  2. python tushare获取股票数据并可视化_荐Python获取股票数据及其可视化--基于tushare库...
  3. 查找最晚入职员工的所有信息---牛客网SQL实战篇
  4. POJ - 2289 Jamie's Contact Groups(二分图多重匹配)
  5. 今日头条们:一边道歉一边做大
  6. Redis set集合结构及命令详解
  7. the third assignment of software testing
  8. ubuntu 18.04 解决无法联网的问题
  9. 运行vue遇到的坑(续更
  10. JS+html--实现图片轮播
  11. Python基础教程(第三版)读书笔记(8)
  12. 利用Spire.PDF转换Excel成PDF
  13. 2017阿里实习生在线编程题
  14. PID控制 通俗理解和简单实践
  15. 计算机如何访问苹果6s的相册,苹果手机怎么连接到电脑传照片 两种方法帮你实现!...
  16. 通过朋友网信息查找QQ号~
  17. 162号段,165号段,167号段
  18. iView框架Select组件
  19. Java实现高数的收敛级数和不定积分求圆周率
  20. 函数的右导数与导函数的右极限的关系

热门文章

  1. 数据丢失不用怕,迅捷转换器来帮您
  2. 阿里副总裁车品觉:无数据不成活
  3. CSS_弹性盒子模型
  4. 【中航机考测试感悟】
  5. 接口需求文档的书写总结
  6. 1.js简介,JavaScript的组成,js环境搭建
  7. Fiddler抓包工具手机添加代理后连不上网解决办法
  8. 小学信息说课稿范文认识计算机,小学信息技术说课稿《认识计算机》-20210410201013.docx-原创力文档...
  9. 计算机科学与技术具有哪些特点,2017考研:计算机科学与技术学科特点
  10. TCP报文的标志字段