一:什么是哈希算法
对于学习该文章的笔记。https://www.cnblogs.com/GotoJava/p/7571405.html
散列算法,又称哈希算法。它可以通过一个函数将一个任意长度的数据转化成为长度固定的字符串。
哈希的思路:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。
在哈希表中存在着表的位置和关键字存在某一确定位置。
二:哈希构造函数方法
1.直接定址:
以数据元素关键字k本身或它的线性函数作为它的哈希地址。H(k)=k 或 H(k)=a×k+b ; (其中a,b为常数)
此法仅适合于:地址集合的大小 == 关键字集合的大小,其中a和b为常数。
2.数字分析法:
数字分析法是取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。当关键字较多时通过对该关键字的分析丢掉不均匀的位,其他的作为哈希地址。该方法只适用于所有关键字已知的情况,并且预知每个关键字出现的频数。
例: 要构造一个数据元素个数n=80,哈希长度m=100的哈希表。不失一般性,我们这里只给出其中8个关键字进行分析,8个关键字如下所示:
K1=61317602 K2=61326875 K3=62739628 K4=61343634
K5=62706815 K6=62774638 K7=61381262 K8=61394220
分析上述8个关键字可知,关键字从左到右的第1、2、3、6位取值比较集中,不宜作为哈希地址,剩余的第4、5、7、8位取值较均匀,可选取其中的两位作为哈希地址。设选取最后两位作为哈希地址,则这8个关键字的哈希地址分别为:2,75,28,34,15,38,62,20。
3.折叠法:
将关键字分割成若干部分,然后取它们的叠加和为哈希地址。两种叠加方式:移位叠加和边界叠加。
移位叠加:将分割后的几部分低位对齐相加。
边界叠加::从一端沿分割界来回折叠,然后对齐相加。
适用于关键字位数较多,而且关键字中每一位上数字分布大致均匀的情况。
4.平方取中法
先计算出关键字的平方,然后根据哈希表的空间大小,选取平方数是中间几位为哈希地址。
例 :设哈希表长为1000,则取关键字平方值的中间三位 关键字:1234 关键字的平方:15 227 56 哈希函数值:227
此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象
5.减去法
减去法是数据的键值减去一个特定的数值以求得数据存储的位置。
例 :公司有一百个员工,而员工的编号介于1001到1100,减去法就是员工编号减去1000后即为数据的位置。编号1001员工的数据在数据中的第一笔。编号1002员工的数据在数据中的第二笔…依次类推。从而获得有关员工的所有信息,因为编号1000以前并没有数据,所有员工编号都从1001开始编号。
6.基数转换法
6.基数转换法
将十进制数X看作其他进制,比如十三进制,再按照十三进制数转换成十进制数,提取其中若干为作为X的哈希值。一般取大于原来基数的数作为转换的基数,并且两个基数应该是互素的。
例Hash(80127429)=(80127429)13=8137+0136+1135+2134+7133+4132+2*131+9=(502432641)10如果取中间三位作为哈希值,得Hash(80127429)=432
为了获得良好的哈希函数,可以将几种方法联合起来使用,比如先变基,再折叠或平方取中等等,只要散列均匀,就可以随意拼凑。
7.除留余数法:
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为:h(k)=k % p ,其中%为模p取余运算。
理论研究表明,除留余数法的模p取不大于表长且最接近表长m素数时效果最好,且p最好取1.1n~1.7n之间的一个素数(n为存在的数据元素个数)
8.随机数法:
设定哈希函数为:H(key) = Random(key),其中,Random 为伪随机函数。
此法适于:对长度不等的关键字构造哈希函数。
9.随机乘数法也称为“乘余取整法”
(1)确定一个随机实数f,0≤f<1。
(2)将随机数与关键字相乘,即f*k取该乘积的小数部分y。
(3)将(2)得到的小数部分y与哈希表的长度n相乘得到z。
(4)将算得的z取其整数部分作为哈希值。
其表达公式为:Hash(k)=「n*(fk%1)」其中“fk%1”表示fk 的小数部分,即fk%1=fk-「fk」
10.旋转法
旋转法是将数据的键值中进行旋转。
可以只输入一个数值从而快速地查到有关学生的信息