1、查找算法的评价指标
1、1查找长度
在查找运算中,需要对比关键字的次数称为查找长度
1、2平均查找长度
所有查找过程中进行关键字的比较次数的平均值
2、查找表
2、1定义
由同一类型的数据元素((记录)组成
2、2静态查找表
只需要查找操作
-
顺序查找
-
查找成功:(n+1)/2
-
查找失败:(n+1)
-
有的顺序表设置了哨兵位:不用判断数组越界效率更高
-
-
折半查找:仅适用于有序表
-
分块查找
-
判定树
-
成功结点的关键字对比次数 = 结点所在层数
-
失败结点的关键字对比次数 = 其父节点所在层数
-
因此对同一层的元素,查找成功和查找失败时比较的次数相等
-
树的高度计算和完全二叉树一样:log2[n]+1
-
2、3动态查找表
除了查找,还需要增/删数据元素
二叉排序树查找
平衡树查找
红黑树查找
哈希查找
3、顺序查找
3、1实现
1、从头到尾挨个找
2、适用于顺序表、链表,表中元素有序无序都可以
3、可在0号位置存"哨兵",从尾部向头部挨个查找优点:循环时无需判断下标是否越界
3、2复杂度:O(n)
4、折半查找
4、1思想
1、在[low, high]之间找目标关键字,每次检查mid=(low+high)/2
2、根据mid所指元素与目标关键字的大小调整 low或high,不断缩小 low和high的范围
3、若low>high 则查找失败
4、2判定树
-
构造
1、由mid所指元素将原有元素分割到左右子树中
2、Key:右子树结点数--左子树结点树=0或1
-
特性
1、折半查找的判定树是平衡的二叉排序树(左<中<右)
2、折半查找判定树,只有最下面一层是不满的
3、若查找表有n个关键字,则失败结点有n+1个 4、树高h= 「log2(n +1)1 (不包含失败结点)
-
注意:
n为奇数,左右节点个数相等。 向下取整,左边比右边少1。 向上取整,左边比右边多1
时间复杂度:O(logn)
注意:只适用于顺序表
5、分块查找(索引顺序查找)
块内无序、块间有序
5、1思想
1、索引表中记录每个分块的最大关键字、分块的区间
2、先查索引表(顺序或折半)、再对分块内进行顺序查找
5、2特点:块内无序,块间有序
ASL=查索引表的平均查找长度+查分块的平均查找长度
顺序查找索引表
折半查找索引表
6、散列查找
6、1散列表
又称哈希表。是---种数据结构,特点是︰数据元素的关键字与其存储地址直接相关
6、1处理冲突的方法
-
拉链法
把所有"同义词"存储在一个链表中
同义词:具有相同映射值的关键字
-
开放定址法
是指可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放
-
线性探测法
即发生冲突时,每次往后探测相邻的下一个单元是否为空,这个是考的最多的。
-
平方探测法
-
即+1,-1,+4、-4、+9、-9。即有前有后
-
伪随机序列法
-
再散列法
-
6、2散列函数
除留余数
直接定址法
数字分析法
平方取中法
7、B+树
引入目的:对比分块查找
7、1特性
1)每个分支结点最多有m棵子树(孩子结点)。
2)非叶根结点至少有两棵子树,其他每个分支结点至少有「m/2]棵子树。
3)结点的子树个数与关键字个数相等。
4)所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来。
5)所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其子结点的指针。
7、2和B树的区别
1、叶子结点:均指的是失败结点,即虚拟的结点
2、二叉查找树的进化一--->m叉查找树,即B树
分块查找的进化------>多级分块查找,即B+树
3、B树:n个关键字对应n+1个分叉(子树)
B+树:n个关键字对应n个分叉
4、B树:所有结点中都包含记录的信息
B+树:只有最下层叶子结点才包含记录的信息
5、B树:不支持顺序查找。查找成功时,可能停在
任何一层结点,查找速度"不稳定" B+树:支持顺序查找。查找成功或失败都会到达 最下一层结点,查找速度"稳定"
8、B树
引入目的:二叉排序树分支太窄,想让分支变宽,故引入B树。即m叉查找树(m>2)
8、1特性
1、根节点的子树数∈[2, m],关键字数∈[1, m-1]。 其他结点的子树数∈[ [m/2], m];
2、关键字数∈[[m/2]-1, m-1] 2、对任一结点,其所有子树高度都相同
3、关键字的值:子树0<关键字1<子树1<关键字2<子树2<....(类比二叉查找树左<中<右) 因为它对标的是二叉排序树,因此它也是一棵排序树
操作
-
插入:B树的插入操作一定是在底层 结点进行插入的。
1、通过"查找"确定插入位置(---定是在终端结点) 2、若插入后结点关键字个数未超过上限,则无需做其他处理 3、若插入后关键字个数超过上限,则需要将当前结点的中间元素放到父节点中,当前结点分裂为两个部分;该操作会导致父节点关键字个数+1,若父节点关键字个数也超过了上限,则需要再向上分裂;根节点的分裂会导致B树高度+1。
-
删除
-
非终端结点关键字
1、用其直接前驱或直接后继替代其位置,转化为对"终端结点"的删除 2、直接前驱:当前关键字左边指针所指子树中"最右下"的元素 3、直接后继:当前关键字右边指针所指子树中"最左下"的元素
-
终端结点关键字
-
删除后结点关键字个数未低于下限,无需任何处理
-
低于下限
1、右兄弟够借,则用当前结点的后继、后继的后继依次顶替空缺 2、左兄弟够借,则用当前结点的前驱、前驱的前驱依次顶替空缺 3、左(右)兄弟都不够借,则需要与父结点内的关键字、左(右)兄弟进行合并。合并后导致父节点关键字数量-1,可能需要继续合并。
-
-
9、红黑树
引入目的
插入/删除很多时候不会破坏"红黑"特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成
9、1定义
红黑树是二叉排序树
左根右、根叶黑、不红红、黑路同
9、2插入操作
新结点为根染黑
新结点非根染红,若插一入后违反"不红红",则看叔叔的脸色
黑叔
LL------右单旋,父换爷+染色 RR---左单旋,父换爷+染色 LR------左、右双旋,儿换爷+染色 RL---右、左双旋,儿换爷+染色
红叔
染色+变新 叔父爷染色,爷变为新结点
9、3性质
从根节点到叶结点的最长路径不大于最短路径的2倍
有n个内部节点的红黑树高度h<=2log (n+1)
注意:适用于频繁插入、删除的场景,实用性更强
10、平衡二叉树
定义
1、树上任一结点的左子树和右子树的高度之差不超过1. 2、结点的平衡因子=左子树高-右子树高
插入操作
1、和二叉排序树一样,找合适的位置插入 2、新插入的结点可能导致其祖先们平衡因子改变,导致失衡
调整不平衡
找到最小不平衡子树进行调整,记最小不平衡子树的根为A
LL:在A的左孩子的左子树插入导致A不平衡,将A的左孩子右上旋
RR:在A的右孩子的右子树插入导致A不平衡,将A的右孩子左上旋
LR:在A的左孩子的右子树插入导致A不平衡,将A的左孩子的右孩子先左上旋再右上旋 RL:在A的右孩子的左子树插入导致A不平衡,将A的右孩子的左孩子先右上旋再左上旋
查找效率分析
平衡二叉树最大深度为O(log n),平均查找长度/查找的时间复杂度为O(log n)
注意:适用于以查为主、很少插入/删除的场景
11、二叉排序树
定义
1、左子树结点值<根结点值<右子树结点值
2、默认不允许两个结点的关键字相同
操作
-
查找
从根节点开始,目标值更小往左找,目标值更大往右找
-
插入
找到应该插入的位置(一定是叶子结点),一定要注意修改其父节点指针
-
删除
1、被删结点为叶子,直接删除
2、被删结点只有左或只有右子树,用其子树顶替其位置
3、被删除结点有左、右子树: 可用其后继结点顶替,再删除后继结点 或用其前驱结点顶替,再删除前驱结点 前驱:左子树中最右下的结点 后继:右子树中最左下的结点
查找效率
1、取决于树的高度,最好O(log n),最坏O(n) 平均查找长度的计算: 查找成功的情况 查找失败的情况(需补充失败结点)