一、哈希
hash key 的选取&冲突处理
数值
1. 直接取余法(一般选质数M为除数,如果m约数多,取模后分布不均)
2. 数字分析法(取数据值分布均匀的位数)
3. 平方取中法(即计算关键值的平方,结合数字分析法,取中间r位,形成一个大小为2^r的表)
4. 折叠法(将key分成m位一断,再按位相加得到新的key)
字符串
1. 折叠法所有字符ASCⅡ码相加
冲突处理
1. 拉链法
2. 开放定址法(线性探测法、二次探查发、哈希函数探查法)
PS:!!哈希函数探查法h1、h2两个哈希函数,(d+n*h2(key))%m,所选择h2(key)一定和m互质
三种探查过程终止于以下三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入,则将key写入其中)
(2)若当前探查的单元中含有key,则查找成功(插入失败)
(3)若探查到table[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入都失败(表满)
HDU1425 sort
很水的一道哈希,没什么技术含量,注意输入输出叭。
#include <stdio.h>
#include <math.h>
using namespace std;
bool a[1000000];
int main(){
int n,m,x,i,j;
while(scanf("%d%d",&n,&m)!=EOF){
for(i = 0; i<n; i++)
a[i] = 0;
for(i = 0; i<n; i++){
scanf("%d",&x);
a[x+500000] = true;
}
j = 0;
for(i = 1000000; j<m; i--){
if(a[i]){
printf("%d",i-500000);
j++;
if(j != m)
printf(" ");
else
printf("\n");
}
}
}
return 0;
}
注意:
哈希函数映射到数组时,如果数组开的太小,就会使查找过程复杂度显著升高,可能导致超时。
一般哈希解决的问题朴素查找算法也能解决,只是哈希在合理设计的基础上节省了时间,做提前做好时间复杂度的分析,分析所使用算法的优选程度。
- 网上搜各大OJ哈希的题目,没有找到很合适的应用练习,有时间看看《高级数据结构》上的几个应用例子,总结一下再来做补充。