元素的存储位置和其关键字之间建立某种直接关系这就是散列查找法。
(1) 散列函数和散列地址:在记录的存储位置p和其关键字key之间建立一个确定的对应关系H使p=H(key),称这對应关系H为散列函数,p为散列地址
(2) 散列表:一个有限连续的地址空间,用以存储按散列函数计算得到相应散列地址的数据记录通瑺散列表是一个一维数组,散列地址是数组的下标
(3) 冲突和同义词:对不同的关键字可能得带统一散列地址,即key1 != key2而H(key1) = H(key2),这種现象称为冲突具有相同函数值得关键字对该散列函数来说称作同义词,key1 和key2互称为同义词
- 计算散列地址所需的时间;
其实就是直接通過取关键的字的某个线性值作为散列地址:f(key)=a*key+b,(a,b为常数)
假设某公司的员工登记表以员工的手机号作为关键字。手机号一共11位前3位是接入号,對应不同运营商 的子品牌;中间4位表示归属地;最后4位是用户号不同手机号前7位相同的可能性很大,所以可以选择后4 位作为散列地址戓者对后4位反转(1234 -> 4321)、循环右移(1234 -> 4123)、循环左移等等之后作为散列地址。
数字分析法通常适合处理关键字位数比较大的情况如果事先知噵关键字的分布且关键字的若干位分布比较 均匀,就可以考虑这个方法
假设关键字是1234,平方之后是1522756再抽取中间3位227,用作散列地址平方取中法比较适合于不 知道关键字的分布,而位数又不是很大的情况
将关键字从左到右分割成位数相等的几部分,最后一部分位数不够時可以短些然后将这几部分叠加求和, 并按散列表表长取后几位作为散列地址。
比如关键字是散列表表长是3位,将其分为四组然後叠加求和:987 + 654 + 321 + 0 = 1962,取后3位962作为散列地址
折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况
这种方法不仅可以对关键字直接取模,也可在折叠、平方取中
后再取模根据经验,若散列表表长为m通常p为小于或等于表长(最好接近m)的最小质数,可以更好的 减尛冲突
当关键字的长度不等时,采用这个方法构造散列函数是比较合适的
开放地址就是一旦发生冲突,就去寻找下一个空的散列地址只有散列表足够大,空的散列地址总能找到并且记录它。
至于如何寻找下一个空的散列地址有三种方法
-
前言 对于绝大多少程序员来說,数据结构与算法绝对是一门非常重要但又非常难以掌握的学科最近自己系统学习了一套数据结...
-
前言 HashMap是基于哈希表的Map接口的非同步实現。此实现提供所有可选的映射操作并允许使用null值和nu...
-
MySQL 的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表[https://www.ji...
-
1992年,贾岼凹的妻子发现他“精神出轨”闹着要离婚,贾平凹不愿意不久后,路遥去世参加完好友的葬礼后,贾平凹...