1 2 3 4

Hash Table(哈希表)

数据结构--Hash Table(哈希表)
一、基本概念
哈希表(Hash Table,也叫散列表)定义:哈希表是一种根据关键码去寻找值的数据映射结构。它通过把关键码值
映射到表中的一个位置来访问记录。哈希表是一个数组。
哈希函数(映射函数):index = H(key),通过传递key值映射出位置。

二、Hash Table大小的确定
Hash Table大小的确定也非常关键,如果Hash表的空间远远大于最后实际存储的记录个数,则造成了很大的空间浪
费,如果选取小了的话,则容易造成冲突。在实际情况中,一般需要根据最终记录存储个数和关键字的分布特点来
确定Hash表的大小。还有一种情况是可能事先不知道最终需要存储的记录个数,则需要动态维护Hash表的容量,
此时可能需要重新计算Hash地址。
装载因子:指所有关键字填充哈希表后饱和的程度,它等于装填因子(T)=关键字总数(N)/哈希表的长度(L),T=N/L

三、哈希冲突以及解决办法
哈希冲突:可能传递不一样的key值时候产生相同的结果,即:H(key1) = H(key2)
哈希冲突的解决办法:
(1)开放定址法。这个可以分三种
Hi = (H(key) + Di) MOD M,(i = 1,2,3...k)(k<=m-1),其中m为表长,Di为增量序列
a.线性探测再散列,Di可能为1,2,3,4...m-1
b.二次探测再散列,Di的取值可能为1,-1,2,-2,4,-4....k^2,-k^2(k<=m/2)
c.随机探测再散列。Di取值为伪随机探测再散列。
(2)链地址法。原理是如果遇到冲突,它就会在原地址新建一个空间,然后以链表结点的形式插入到该空间。

 

 

(3)再散列法。准备若干个hash函数,如果使用第一个hash函数发生了冲突,就使用第二个hash函数,第二个也
冲突,使用第三个....


四、Hash Table的查找
查找过程和造表过程一致,假设采用开放定址法处理冲突,则查找过程为:
对于给定的key,计算hash地址index = H(key)
如果数组arr[index]的值为空 则查找不成功
如果数组arr[index]== key 则查找成功
否则 使用冲突解决方法求下一个地址,直到arr[index]== key或者 arr[index] ==null

五、Hash Table的删除
首先链地址法是可以直接删除元素的,但是开放定址法是不行的,拿前面的双探测再散列来说,假如我们删除了
元素1,将其位置置空,那 23就永远找不到了。正确做法应该是删除之后置入一个原来不存在的数据,比如-1。

 六、Hash Table的应用

a.Hash主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做
Hash值. 也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系。

b.查找:哈希表,又称为散列,是一种更加快捷的查找技术。我们之前的查找,都是这样一种思路:集合中拿
出来一个元素,看看是否与我们要找的相等,如果不等,缩小范围,继续查找。而哈希表是完全另外一种思路:
当我知道key值以后,我就可以直接计算出这个元素在集合中的位置,根本不需要一次又一次的查找!

举一个例子,假如我的数组A中,第i个元素里面装的key就是i,那么数字3肯定是在第3个位置,数字10肯定是在
第10个位置。哈希表就是利用利用这种基本的思想,建立一个从key到位置的函数,然后进行直接计算查找。

c.Hash表在海量数据处理中有着广泛应用。

 

参考:https://www.cnblogs.com/s-b-b/p/6208565.html

https://www.cnblogs.com/lchzls/p/6714079.html

https://blog.csdn.net/yyyljw/article/details/80903391

https://blog.csdn.net/u011109881/article/details/80379505

posted @ 2020-05-20 11:00  boldness2012  阅读(273)  评论(0编辑  收藏  举报