概念
- 检索表:待查找的数据容器,例如线性表、树表(树、二叉树、B/B+树)等
- 关键字:key
- 关键字值:key对应的value
- 检索/查找:Search
1. 线性表的检索
1.1 顺序检索
可用于所有线性表,包括顺序表和链表。
1.2 二分法检索
只能用于顺序表(数组)。
1.2.1 黄金分割点检索
与二分法检索类似,但是分割检索区间的方式不同;二分法以二等分的方式分割检索区间,黄金分割点以0.618比例方式分割检索区间
1.3 精算点检索
如果检索表是有序而且分布均匀的,可通过计算估算检索位置。只能用于顺序表。
1.3 分块检索
是顺序检索的一种改进方法。效率介于顺序检索和二分查找之间。分块检索不要求检索表中所有记录关键字有序排列,但要求把检索表分成若干块,并且各块之间按key大小有序。即块间有序、块内无序。
1.4 跳跃表
又叫跳表,一种基于有序链表的扩展,具有二分查找的查找效率,又具有链表的插入/删除效率。
2. 树表的检索
2.1 二叉检索树/二叉查找树(BST:Binary Search Tree)
- 是一个二叉树
- 左子树不空,则左子树上所有结点的值小于根结点的值
- 右子树不空,则右子树上所有结点的值大于根结点的值
- 查找时比较次数不超过树的深度
2.1.1 平衡二叉树/AVL树
平衡因子的绝对值不超过1的二叉树(网上查到都是说平衡二叉树是二叉检索树)。
平衡因子:该结点的左子树深度减去右子树深度的差
- 插入或删除结点可能导致不平衡,需要调整
2.2 B树/B+树
B树是一种平衡的多路检索树(平衡N叉检索树)
B树的特点:
- 一个结点最多有N-1个键(key)
- 一个结点最多有N棵子树
- 除根结点外,所有非终端结点至少有[N+1/2]棵子树
B+树的特点:
- 是一种B树的变形树
- 有n棵子树的结点含有n个键(key)
- 节点的每个键是对应子树的最大(或最小)键
- 所有叶子结点包含了全部键的信息
3. 哈希检索
前两种检索方式,键在检索表中的位置都是随机的,或者说是相对的,与其键(key)不存在某种确定的关系。
哈希检索是一种直接利用键来确定记录在检索表中位置的技术。
- 哈希函数
- 哈希地址冲突(collision)
3.1 地址冲突的消解策略
在数据插入时,可能发生插入的位置已经存在数据,即有地址冲突。如何解决这个问题?
3.1.1 开发定址法
从插入的位置开始,查找一个最近的空地址用于存储记录。
- 线性探查法
将哈希表看作是环形表,从当前地址往后查:(d+1)%m、(d+2)%m…,m为哈希表的长度 - 平方查找法
以(d+i)%m的方式查,i取值:12 , -12 , 22 , -22 … - 随机探查法
选取随机数作为地址位移来计算下一个地址
3.1.2 拉链法
将哈希地址相同的键的记录链接到同一个单链表中。