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,则无论是查找还是插入都失败(表满)
很水的一道哈希,没什么技术含量,注意输入输出叭。
#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哈希的题目,没有找到很合适的应用练习,有时间看看《高级数据结构》上的几个应用例子,总结一下再来做补充。新闻热点
疑难解答