哈希表

哈希=散列
哈希法=散列法,对应的哈希表=散列表
什么是哈希法?
哈希法思想:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=f(k),从而达到按关键字直接存取元素的目的。
哈希表冲突
当关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,即 k1≠k2 ,但 H(k1)=H(k2),这种现象称为冲突,此时称k1和k2为同义词。实际中,冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。

综上所述,哈希法主要包括以下两方面的内容:
1)如何构造哈希函数
2)如何处理冲突。

构造哈希函数较少冲突方法:
1,数字分析法
2,平方取中法
3,分段叠加法
4,除留余数法
5,伪随机数法

冲突解决:
1,开放定址法
①线性探针再散列
②二次探针再散列
③伪随机探针再散列
2,再哈希法
3,链地址法
4,建立公共溢出区

问题1:哈希表是如何实现的?

官话:元素关键字key和元素存储位置locaiton之间存在一种对应关系,location = f(key), f叫做哈希函数,根据函数关系创建哈希表,将关键字为key的元素直接存入f(key)的单元;以后查找关键字为key的元素时,利用哈希函数计算出该元素的存储位置location=f(key),实现按关键字key存取元素的目的。

问题2:如何解决地址冲突?

1,开放定址法(再散列法):
其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
有三种:
1,线性探针再散列,2,平方探针再散列,3,伪随机探针再散列

2,再哈希法:
这种方法是同时构造多个不同的哈希函数(函数前加个斜率值,即y=kx,改为y = krx,r = 1,2,3,4,5.。。。)

3,这种方法的基本思想是将所有哈希地址为x的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第x个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
(说白了就是指针数组后边跟着一个单链表,为每个 Hash 值建立一个单链表,当发生冲突时,将记录插入到链表中。)

4.建立公共溢出区:
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

参考:
1
2

你可能感兴趣的:(哈希表)