目录
前言-哈希表概念:
哈希表也是一种存储信息的结构,他是通过映射数据本身从而得到一个“影子位置”,该“影子位置”就是哈希表中存储该数据的位置,因此哈希表的优势在于查找数据时,并不会像其他顺序结构、树结构一样,将要查找的数据和载体中的数据直接比较,而是根据数据找到其在哈希表中的映射位置,然后直接用下标访问哈希表的映射位置,让数据与此位置的值进行对比即可。
1、哈希表的用法
哈希表的关键在于如何将数据和映射位置建立关系,通常会通过一个函数来实现他们的转换,并把这个函数叫做哈希函数。通过函数找到数据在哈希表中的映射位置,举例:现有数组{4,9,6,5,3,2},具体示意图如下:

因此,在没有哈希表时,查找一个数据需要跟数组中的数据挨个比较,直到对比相同时或者遍历完数组时才有结果(效率O(N)),而有了哈希表后,直接通过哈希函数求出该数据在哈希表中的映射位置,并且用下标访问哈希表,就可以得到一个结果(效率O(1))。
但是此哈希函数有一个缺陷,即上述数组中有一个元素为1000,则总共只有七个元素但是哈希表需要开1001个空间,浪费了很多不必要的空间。
2、哈希函数-除留余数法
上述哈希函数会导致空间浪费的问题,于是推出另一种方法:除留余数法。该方法是模上哈希表本身的大小,只是最开始哈希表的大小需要给定一个数n,比如上述数组加了元素1000后数组为:{4,9,6,5,3,2,1000},该数组的大小是7,则模上一个接近7的数(或者是7)即可(这里n举例为10)。得到哈希函数:映射位置=数据%n。并且n表示哈希表的大小。
示意图如下:

3、哈希冲突
除留余数法虽然解决了空间浪费的问题,但是以上还有一个问题就是如果数组中插入了一个元素19,那么19和9都会放到哈希表的映射位置9处,把这种映射位置相冲突的情况叫做哈希冲突。
具体示意图如下:

4、闭散列和开散列
解决哈希冲突的方法有两种: 闭散列和开散列。(ps:实际上闭散列不能有效解决哈希冲突,因此用的最多的方法还是开散列,但是这里还是提一下闭散列)。
4.1 闭散列
闭散列用的方法实际上就是发生冲突后,把后映射数据的位置挪到原本位置的下一个位置,若下一个位置也存在数据,则继续往下一个位置走,直到走到空位置处,因此可以把这个过程看作是不断+i的过程,并且把这种方法叫做线性探测:即从冲突位置开始,不断的向后探测直至探测到空位置。
用线性探测解决上述冲突具体示意图:

最低0.47元/天 解锁文章
5036

被折叠的 条评论
为什么被折叠?



