认识算法之数据结构(六)哈希表

哈希表(Hash tables)

什么是哈希表

在介绍哈希表的时候,先回顾一下前几章的内容,再来比较下数组和链表的优缺点。

数组:寻址容易,但插入和删除元素比较麻烦; 链表:插入和删除元素容易,但寻址比较麻烦。数组

那么有没有一种数据结构是既能结合这两种的优势同时也能避免这两种数据结构所带来的缺点呢?答案是有的,那就是如今所讲的哈希表。
哈希表又称为散列表,是根据关键码值(Key,value)而直接进行访问的数据结构。  
它提供了快速的插入操做和查找操做,不管哈希表总中有多少条数据,  
插入和查找的时间复杂度都是为O(1)
复制代码
以上是哈希表的定义,其结构示意图以下所示:

从上述结构中我 最左边的为key,经过中间的哈希运算(hash function)从而造成一个有意义的数字下标数组,从而与右边的value/buckets即元素内容造成了一个肯定的对应关系。
彷佛很难懂这三者(Keys,hash function,buckets)之间的关系,那么就举个例子🌰吧:👇👇👇

怎么正确创建学号(Key)与Value之间的映射关系呢? 咱们能够经过这样的哈希运算 学号(key) - 201735020330 所得出的结果即做为存放Value的数组中,好比这个池早香,她的学号是201735020336,经过咱们的哈希运算得数组下标值为6,那么咱们就能够将其姓名和电话号码放进这个下标值为6的数组中。这样一个简单的哈希表就完成了。

❓ 哈希运算(hash funchion)有特定的运算方式吗?

没有,但为了构造一个好的哈希函数:咱们但愿hash函数做用在不一样的key时,所获得的value可以均匀的分布在hash表中,即能尽量少的减小地址冲突。比较常见的hash函数的构造方法有:
1)直接定址法 2)数字分析法3)平方取中 4)折叠法5)除留余数法

❓ 刚刚提到了地址冲突,什么是地址冲突?

当你用hash函数做用在两个互不相同的key上,获得的value值相等。这就比如“下面有请王先生上台演讲”,但底下那么多姓王的,不知道叫的是哪一个王先生,只好一块儿上台了。所以正如上面所说,好的哈希运算须要慎重考虑其运算方法,避免出现地址冲突。但万一真的发生怎么办呢?一般有两个办法解决:
  1. 链地址法:
如图所示,采用链表的办法,将冲突的地址内容经过线性表的方式串联起来,而后在这个地址里经过顺序检索查找出咱们想要的值。
  1. 开放地址法:
其方法就是找到一个未被占用地址的数组,并将元素存储进去,寻找空地址的方法有不少,而上图的方法就是较为简单线性查找法,从冲突的地址开始,往下搜索空地址。

为何要用哈希表

1)索引速度快。2)方便数据的增删改查

相比于于数组和链表,若是咱们以链表的方式依次查找,面对企业级的上千万的数据是很是耗时耗内存的。而若是咱们使用数组的结构进行业务操做也会因删除和插入而浪费不少时间。

哈希表简单的实现

相关文章
相关标签/搜索