文章目录
下列元素存储均从数组下标0开始。
1.顺序查找
思想:从线性表的一端开始,顺序扫描,依次将扫描到的值与定值k比较,若当前扫描的关键字与k相等,则查找成功;若扫描结束仍未发现关键字等于k的记录,则查找失败。
代码
int seqSearch(int a[],int n,int k)
{
for(int i=1;i<n;i++)
if(a[i]==k)return i;
return -1;
}
2.折半查找
思想:对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。
代码
//仅适用于有序的顺序表
int binSearch(int a[],int l,int r,int k)
{
while(l<=r){
int mid=(l+r)/2;
if(a[mid]==k)return mid;
else if(a[mid]>k)r=mid-1;
else l=mid+1;
}
return -1;//查找失败返回-1
}
3.哈希(散列)表
思想:它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列查找是一种典型的“空间换时间”的算法。
3.1哈希函数的构造方法
3.1.1除留取余法
H ( k e y ) = k e y % p ( p ≤ m ) p 一 般 为 小 于 或 等 于 表 长 的 最 大 质 数 H(key)=key \%p(p\le m) p一般为小于或等于表长的最大质数 H(key)=key%p(p≤m)p一般为小于或等于表长的最大质数
3.1.2直接定址法
H ( k e y ) = a × k e y + b H(key)=a \times key+b H(key)=a×key+b
3.1.3平方取中法
取 关 键 字 的 平 方 值 的 中 间 几 位 作 为 散 列 地 址 取关键字的平方值的中间几位作为散列地址 取关键字的平方值的中间几位作为散列地址
3.1.4数字分析法
选 取 数 码 分 布 较 为 均 匀 的 若 干 位 作 为 散 列 地 址 ( 如 电 话 号 码 等 ) 选取数码分布较为均匀的若干位作为散列地址(如电话号码等) 选取数码分布较为均匀的若干位作为散列地址(如电话号码等)
3.2处理哈希冲突的方法
3.2.1链地址法
把 所 有 同 义 词 用 单 链 表 连 接 起 来 把所有同义词用单链表连接起来 把所有同义词用单链表连接起来
3.2.2开放定址法
H i ( k e y ) = ( H ( k e y ) + d i ) % m , d i 为 增 量 序 列 , i 表 示 “ 第 i 次 发 生 冲 突 ” H_i(key)=(H(key)+di) \%m ,di为增量序列,i表示“第i次发生冲突” Hi(key)=(H(key)+di)%m,di为增量序列,i表示“第i次发生冲突”
线性探测法
增
量
序
列
:
d
i
=
0
,
1
,
2
,
3...
,
m
−
1
增量序列:di=0,1,2,3...,m-1
增量序列:di=0,1,2,3...,m−1
平方探测法
增
量
序
列
:
d
i
=
0
2
,
1
2
,
−
1
2
,
2
2
,
−
2
2
,
.
.
.
,
k
2
,
−
k
2
(
k
≤
m
2
)
增量序列:di=0^2,1^2,-1^2,2^2,-2^2,...,k^2,-k^2 (k\le \frac{m}{2})
增量序列:di=02,12,−12,22,−22,...,k2,−k2(k≤2m)