我们现已有的查找方式及其复杂度有以下几种:
顺序查找 :O(N)
二分静态查找: O(logN)
二叉搜索树: O(n)
而在现实生活中,比如QQ的用户数据库,它可能有上亿的数据需要查找,而我们运用上面哪一种都不太合适,由此我们的前辈想出了一种散列查找的方法。
散列查找,是将存储位置与查找数据关键字运用某种数学关系串联起来的方法。
这种对应关系叫做散列函数或者哈希(Hash)函数。
散列查找法的两项基本工作:
- 构造散列函数:确定关键词所在的存储位置的计算方法。
- 解决冲突;
因为既然是对应关系,可能会有两个元素通过Hash函数之后得出的存储位置是同一个,那么我们还要解决这个问题所带来的后果。
数字关键词的散列函数构造
- 直接定址法
取关键词的某个线性函数值作为散列地址。
散列函数:
h(kye)=a×key+b(a,b为常数) - 除留余数法
散列函数:
h(key)=key mod p
p可以自己选择。 - 数字分析法
h(key)=atoi(key+n)
n是自己分析出的比较具有特点的数,比如你的身份证号上的生日位等等。
字符关键字的散列函数构造:
贴上一个我以前写的字符串哈希的博客
字符串哈希
处理冲突的方法
- 开放地址法
定义:一旦存储位置发生了冲突,那么就去设定一个式子去寻找另外一个空的散列地址。
基本公式:
hi(key)=(h(key)+di)mod TableSize(1<=i<TableSize);
di的不同则衍生出三种不同的冲突解决方案。
线性探测:di=i;
二次探测:di=+i2或者-i2
(一次正一次负)
双散列:di=i*h2(key)
在添加一个散列函数。 - 分离链接法
这种方法是将关键字为同义词的数据对象通过结点链接存储在同一个单链表内。
这里再次打个广告
贴上一个我以前写的字符串哈希的博客
字符串哈希
如有错误,欢迎评论留言。