查找(顺序、折半、分块、BST、AVL、B-树、B+树、散列表、KMP)
直接看上面这个文章,这个文章里面还有很多链接详细总结了折半查找、B+树和散列表,记得点击跳转查看
其中的KMP(字符串匹配模式)可以看自己的笔记:数据结构 第四章 字符串_zwy2022的博客-CSDN博客_串的最小操作子集
以下内容原文来自
数据结构总结篇
静态查找
若查找目的是为了查询某个特定的数据是否在表中或检索某个特定数据的各种属性,则此类查找表为静态查找表。
1、顺序查找
基本原理:从表一端开始逐个和关键字进行比较,若找到一个记录和给定值相等,则查找成功,反之失败。再简单点就是,一个一个的比大小,看看是否相等。
例子:
顺序查找更适合于顺序存储结构和链式存储结构的查找表。顺序查找需要一个个的去比较,效率很低。
2、折半查找(二分查找)
基本原理:1.把序列分成左中右三部分,左部分小于中间值,右部分大于中间值;
2.把给定值与中间值比较,确定下次查找是在左部分还是右部分;
3.继续上面两步操作,直到成功或失败。
注意:折半查找需要注意给定的序列必须是一个有序序列。
例子:
折半查找具体分析点击链接:折半查找(定义+查找过程+查找算法实现+折半查找判定树+查找ASL+查找性能T(n))
3、分块查找
基本原理:顺序查找和二分法查找的折中,先分块,在块中顺序查找。
注意:分成的各块内部数据可能无序;各块之间有序(第二个块中的元素都比第一个块中元素都大);建立了索引表,索引表按关键字有序。
例子:
静态查找表方法的性能分析
对于动态查找的插入和删除不是特别好讲,我们就不在这里讲了,只是简单的介绍一下什么是二叉排序树和平衡二叉树,B_树后面补充。
动态查找
若再查找的过程中同时插入查找表中不存在的数据,或从查找表中删除已存在的某个数据,则称此类查找表为动态查找表。
1、二叉排序树BST
定义:1.若它的左子树非空,则左子树上所有的结点的值均小于根结点的值;
2.若它的右子树非空,则右子树上所有的结点的值均大于根结点的值;
3.左右子树本身就是两棵二叉排序树。
例子:
定义看上去不是特别好理解,其实特别简单,我们再以例子简单的说一下。左子树的所有节点:3,1,6,4,7,都小于父节点8,右子树所有节点:10,14,13,都大于父节点。什么时候都是父节点大于左孩子,小于右孩子例如:8>3,8<10;3>1,3<6。
2、平衡二叉树AVL
定义:1.它或者是一棵空树
2.或者树中任一结点的左右子树深度相差不超过1。
注意:从定义我们可得到:想要一颗树平衡,有三种情况,节点的平衡度要么为了0,要么为1,要么为-1。(平衡度:节点左子树的高度减去其右子树的高度。)
例子:
上面图在每个节点上标出了平衡度,所有的节点的平衡度的绝对值都小于等于0或1,所以它是一棵平衡二叉树。
是改进的排序二叉树,ASL小,平衡因子绝对值不大于1
平衡调整:
- LL调整,右单旋转调整
- RR调整,左单旋转调整
- LR调整,先左后右双旋转调整
- RL先右后左双旋转调整
B-树
平衡二叉树扩展
结点多关键字的平衡树