查找算法之平衡查找树
前面介绍的算法在最坏的情况下还是很糟糕。这次会介绍一种二分查找树并能保证无论如何构造它,他的运行时间都是对数级别的。理想情况下我们希望能够保持二分查找树的平衡性。但是,在动态插入中保证树的完美平衡的代价太高了。
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-节点,但是这种直白的表示方法实现大多数操作并不方便,因为需要处理的情况太多。我们需要维护两种不同类型的节点,将被查找的键和节点中的每个键进行比较,将链接和其他信息从一种节点复制到另一种节点,将节点从一种数据类型转换到另一种类型,等等。不仅需要大量的代码,而且产生的额外开销可能会使算法比标准二叉树更慢。
查找算法之平衡查找树相关推荐
- python 查找算法_七大查找算法(Python)
查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Ke ...
- 数据结构之查找算法:折半查找
查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...
- 查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- 数据结构之查找算法:分块查找
查找算法:分块查找 思维导图: 分块查找的定义: 如何分块: 如何查找: 代码实现: 查找效率: 思考: 思维导图: 分块查找的定义: 如何分块: 例: 如何查找: 1.先查找在哪块 2.然后查找块内 ...
- 数据结构之查找算法:顺序查找
查找算法:顺序查找 思维导图: 顺序查找的定义: 顺序查找的代码实现: 顺序查找的性能: 思维导图: 顺序查找的定义: 顺序查找的代码实现: typedef struct { //查找表数据结构int ...
- 查找算法:插值查找算法实现及分析
插值查找算法介绍 插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式key-arr[low]/arr ...
- 查找算法:折半查找算法实现及分析
折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...
- 修改折半查找算法进行范围查找
/*************************************** *修改折半查找算法进行范围查找 ***************************************/ # ...
- 二分查找算法(折半查找算法)
二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...
最新文章
- Smart Crop,一种切除 PDF 扫描文档白边的新选择(工程篇)
- python tushare获取股票数据并可视化_荐Python获取股票数据及其可视化--基于tushare库...
- 查找最晚入职员工的所有信息---牛客网SQL实战篇
- POJ - 2289 Jamie's Contact Groups(二分图多重匹配)
- 今日头条们:一边道歉一边做大
- Redis set集合结构及命令详解
- the third assignment of software testing
- ubuntu 18.04 解决无法联网的问题
- 运行vue遇到的坑(续更
- JS+html--实现图片轮播
- Python基础教程(第三版)读书笔记(8)
- 利用Spire.PDF转换Excel成PDF
- 2017阿里实习生在线编程题
- PID控制 通俗理解和简单实践
- 计算机如何访问苹果6s的相册,苹果手机怎么连接到电脑传照片 两种方法帮你实现!...
- 通过朋友网信息查找QQ号~
- 162号段,165号段,167号段
- iView框架Select组件
- Java实现高数的收敛级数和不定积分求圆周率
- 函数的右导数与导函数的右极限的关系