一、静态查找
1、顺序查找
for循环一趟挨个查找
2、折半查找(有序表的查找)
mid=(low+high)/2 向下取整
key<arr[mid] high=mid-1
key>arr[mid] low=mid+1
3、分块查找
(1)分块--将表分为n块
(2)建索引表--将每个块中最大的key值取出,并排序到索引表
索引表
key---存放每个块中最大的值
link---存放该值对应块的起始地址
(3)查找过程
- 首先通过顺序查找或折半查找索引表,找出 key对u应在哪一块
- 到块中只能通过顺序查找依次查找key值
二、动态查找
1、二叉排序树(BST)
有序的二叉树:左<根<右
2、平衡二叉树(AVL)
|每个结点左孩子高度-右孩子高度|<=1
3、B树(多路搜索树)
多结点有序:左<根<右
三、哈希表查找
1、哈希函数--确定哈希地址
(1)直接定址法 h(k)=k+c
适合:关键字基本联系
特点:以关键字本身或加上一个函数作为哈希地址
(2)除留余数法 h(k)=k mod p
- 构建长为m的哈希表
- 取一个小于m的素数p
- k取余p得哈希地址
[注]素数--质数,除了1和本身之外没有其他因数得自然数
(3)数字分析法 关键字的一部分
取关键字中值较均匀得数字位作为哈希地址
2、解决哈希冲突
(1)开放地址法---地址+di
- 线性探测 di=1,2,3,...m
- 平方探测 di=1方 ,-1方,2方,-2方...
(2)拉链法
特点:将hash冲突的值用单链表连接起来
装填因子(负载系数)=关键字个数/哈希表长=n/m