查找
- 查找表是方便查找的数据结构
- 查找表中元素的每项信息称为字段
- 若字段能标识一个数据元素,则称为关键字或键,能唯一标识的称为主关键字,标识多个的为次关键字
顺序表查找
简单顺序查找
- 取 A [ 0 ] A[0] A[0] 作为监视哨,从 n n n 搜索到 0 0 0
二分查找
- 适用于有序表
- m i d , m i n , m a x mid,min,max mid,min,max 分别存储当前搜索区域中间、最小、最大的位置
- 初始 m i n = 0 , m a x = n , m i n = m a x + m i n 2 min = 0,max=n,min=\frac{max+min}{2} min=0,max=n,min=2max+min
- A [ m i d ] . k e y = = x A[mid].key== x A[mid].key==x 查找结束
- A [ m i d ] . k e y < x , = > m i n = m i d + 1 A[mid].key<x,=>min=mid+1 A[mid].key<x,=>min=mid+1
- A [ m i d ] . k e y > x , = > m a x = m i d − 1 A[mid].key>x,=>max=mid-1 A[mid].key>x,=>max=mid−1
- m a x < m i n max<min max<min 说明查找失败
索引顺序表查找
- “分块有序”:某一部分的所有值均小于后面
- 对数据分块,标记区块首地址和该块元素最大值
- 查找时先查索引,再在对应块中查找
树表查找
二叉排序树
- 二叉排序树是二叉树,为空或:
- 左子树所有元素小于根,右子树所有元素大于根
- 左右子树均为二叉排序树
- 性质:中序序列递增
- 查找:查找元素 x x x 与根结点比较,相等则查找成功, x x x 小于根节点则去左子树搜索,大于根节点则去右子树搜索
- 构造和维护
- 插入:递归调用插入方法,小于根结点插入左子树,大于根节点插入右子树,直到找到空位
平衡二叉树
-
平衡二叉树(Balance Binary Tree),又称 “AVL 树”
- 左右子树的高度差绝对值不超过 1 1 1 (结点的平衡因子 = 左子树高度 - 右子树高度)
- 左右子树都是平衡二叉树
-
平衡二叉树的平衡化:(记最低不平衡结点为 A A A )
- LL 型调整
- RR 型调整
- LR 型调整
-
高度接近 l o g 2 n log_2 n log2n 的数量级,基本操作时间复杂度 O ( l o g 2 n ) O(log_2n) O(log2n)
散列表查找
-
通过对关键字进行直接计算来得到地址
-
“哈希函数(Hash)”,又称“散列函数”,计算出的结果称为“散列地址”,按这种方法建立的表称为“哈希表”或“散列表”
-
不同关键字可能计算出相同的哈希值,称为“冲突”,两个关键字称为“同义词”
-
常用构造哈希函数的方法有:
-
直接定址法:取关键字的某个线性函数作为散列地址,即 :
H ( k ) = a ∗ k + b ( a , b 为 常 数 ) H(k)=a*k+b~(a,b 为常数) H(k)=a∗k+b (a,b为常数) -
除留取余法:取关键字被某个不大于表长 m m m 的数 P P P 除后余数作为散列地址,即 :
H ( k ) = k % P ( P < = m ) H(k)=k~ \% ~P(P<=m) H(k)=k % P(P<=m)
一般 P P P 取素数的时候冲突可能较小 -
平方取中法:取关键字平方后的中间几位
-
折叠法:关键字位数较多而地址区间较小时常用,将关键字分割成相同的部分,再将几部分叠加
-
数值分析法:事先知道所有可能的关键字取值时,分析关键字,根据规律构造
-
-
处理冲突的办法
- 开放定址法:当算出的 H ( k ) H(k) H(k) 位置不空时,依此用下面函数找出新的空位置:
H i ( k ) = ( H ( k ) + d i ) m o d m , 其 中 i = 1 , 2 , … , k ( k ≤ m − 1 ) H_i(k)=(H(k)+d_i)~mod~m~,~其中i=1,2,…,k~(k\le m-1) Hi(k)=(H(k)+di) mod m , 其中i=1,2,…,k (k≤m−1)
-
d i d_i di 的确定有两种办法:
- 线性探测(顺序往后找)
- 二次探测( d i d_i di 取 ± 1 2 , ± 2 2 , ± 3 2 , . . . \pm1^2,\pm2^2,\pm3^2,... ±12,±22,±32,...)
-
再散列法:冲突时用别的散列函数再计算
-
链地址法(拉链法):也称“开散列表”,冲突的话用链表接在原来的元素后面
-
查找过程和构造过程基本一致