0
点赞
收藏
分享

微信扫一扫

哈希表(HASH)

生态人 2022-02-10 阅读 72

1.哈希表概念

2.哈希表的构造

3.哈希冲突

4.总结

1.哈希表概念

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就

是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做

散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,

代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为

哈希(Hash) 函数。

2.构造

(1)除留余数法

 取关键字被某个不大于哈希表长m的数p除后所得的余数为哈希地址。即:
          H(key)=key MODE p,p<=m.(p的取值最好为素数)。
 若冲突较多,可取较大的m和p值。

(2)直接定址法

取关键字或关键字的某个线性函数值为哈希地址

(3)数字分析法

假设关键字集合中的每个分析key中的全体数据,并从中提取分布均匀的若干位或他们的组合构成全体

(4)平均取中法
取关键字平方后的中间几位为哈希地址。

(5)折叠法

将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法。

(6)随机数法

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即

H(key)=random(key),其中random为随机函数。通常用于关键字长度不等时采用此法。

3.哈希冲突

(1)概念:无论哈希函数设计有多么精细,都会产生冲突现象,也就是2个关键字处理函数的结果映射在了同一位置上,因此,有一些方法可以避免冲突。

(2)解决方法:建域法:假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

                            拉链法:拉出一个动态链表代替静态顺序存储结构可以避免哈希函数的冲突,不过缺点就是链表的设计过于麻烦,增加了编程的复杂度。此法可以完全避免哈希函数的冲突。

                            多哈希法:设计二种甚至多种哈希函数,可以避免冲突,但是冲突几率还是有的,函数设计的越好或越多都可以将几率降到最低(除非人品太差,否则几乎不可能冲突)。

                             ④开放地址法:开放地址法有一个公式:Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,...m-1,称线性探测再散列。如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)称二次探测再散列。如果di取值可能为伪随机数列。称伪随机探测再散列。 

4.总结

哈希表是一种以键值对存储数据的结构。如果没有内存限制,那么可以直接将键作为数组的索引。那么所查找的时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样需求内存少。哈希表使用了适度的时间和空间在这两个极端之间找到了平衡。
 

举报

相关推荐

0 条评论