散列表(哈希表)的学习

散列表是最有用的基本数据结构之一,用途非常广泛。对于散列表主要学习散列表的实现、解决碰撞冲突的方法、以及散列函数等。
什么是散列表
首先我们看一下什么是散列表,“散列”从字面上不难看出其含义就是没有顺序。所以我对于散列表的理解就是“一张没有顺序的表”,而散列表常常用于查找,因此我们学习的目的是:如何在一张没有顺序的表中以最快的速度找出我们需要的信息。
什么是散列函数
散列函数是一种“无论你给它什么数据,它都还你一个数字”的函数。实际上就是我们初中学的映射关系,“将输入映射到数字”。另外,我们平时也将输入叫做“键”,对应的数字也就称为“值”,合起来就叫做“键值对”。
下面是散列函数应该满足的一些要求:

  • 对于同一个输入,每次的输出必须一致。就是说如果你输入apple时,输出是2,那么你每次输入apple时输出的必须是2,否则散列表将毫无用处。

  • 应将不同的输入映射到不同的数字。就是说如果有一个散列函数,无论你输入什么它都输出1,那么这就不是一个好的散列函数。所以最理想的情况是:将不同的输入映射到不同的数字。
    下面我们举个例子:
    我们先创建一个空数组,用于存储水果的价格
    在这里插入图片描述
    下面我们将苹果的价格加入到这个数组中:
    过程是:“apple” ---------> 散列函数 ----------> 2
    结果为:
    在这里插入图片描述
    解释一下:“apple”这个字符串作为输入,经过散列函数之后,转化为这个数组的索引2。
    所以我们在查找的时候,我们只需要将“apple”这个字符串用作形参输入到散列函数,我们在散列函数中通过判断“apple”是’a’开头就会得到数组的索引2,然后我们就轻松地知道苹果的价格存储在数组中的什么位置,这样就很快地找到了苹果的价格。
    理想总是很美好,现实总是很残酷。我们想到一个问题,就是以‘a’开头的水果不只有苹果啊,比如还有杨梅“arbutus”,那么存储商品价格的时候我们应该怎么办呢?这就引出了下面的问题:
    如何解决冲突碰撞
    解决冲突碰撞有两种方法:拉链法(也称链表法)、线性探测法
    拉链法
    直接上图
    在这里插入图片描述
    解释一下:简单来说,就是说把冲突的元素串成一个链表,然后挂在数组上面
    下面附上一张标准的基于拉链法的散列表图:
    在这里插入图片描述
    线性探测法
    线性探测法主要依靠数组中的空位解决碰撞冲突。基于这种策略的所有方法被统称为开放地址散列表。其原理如下:
    当碰撞冲突发生时,我们直接检查散列表中的下一个位置(将索引值加1)。这样的线性探测可能会遇到三种情况:

  • 命中,该位置的键和被查找的键相同。

  • 未命中,键为空(该位置没有键)

  • 该位置的键和被查找的键不同,继续查找
    我们用散列函数找到键在数组中的索引,检查其中的键和被查找的键是否相同。如果不同则继续查找(将索引增大,到达数组结尾时折回数组的开头),直到找到该建或者遇到一个空元素。我们习惯将检查一个数组位置是否含有被查找的键的操作称作探测。在这里它可以等价于我们一直使用的比较,不过有些探测实际上是在测试键是否为空。
    过程如下图:
    在这里插入图片描述
    散列表的应用案例

  • 散列表用于查找
    比如你访问www.baidu.com这样的网站时,计算机就必须将baidu.com转换成IP地址。无论什么网站都是一样。所以这就好像将网址映射到IP地址,实际就很适合散列表。

  • 散列表防止重复
    假设你负责维护一个投票系统,规定每人只能投一票,所以每一次投票都需要和已投票者名单进行比对,那么用散列表来进行比对,效率将会提高很多。

  • 散列表用作缓存

  • 缓存是一种常用的加速方式,比如网页缓存就是为了在你下次访问相同网页时会更快,所以很多大型网站都使用了缓存,只为提高用户体验。那么将缓存的数据存储在散列表中,再次访问相同网页时,将会更快。

  • 总结:散列表是算法在时间和空间上做出权衡的经典例子。如果没有内存限制,我们可以直接将键作为数组的索引,那么所有的查找操作需要访问内存一次即可完成。但这种理想情况不会经常出现,因为当键很多时需要的内存太大。另一方面,如果没有时间限制,我们可以使用无序数组并进行顺序查找,这样我们就需要很少的内存。而散列表则使用了适度的时间和空间并在这两个极端之间找到了平衡。所以,我们只需要调整散列算法的参数就可以在时间和空间做出取舍,找到你要的平衡即可。

上面有一部分引用了书籍《算法》中的一部分,有需要的可以读一下

发布了6 篇原创文章 · 获赞 5 · 访问量 72

猜你喜欢

转载自blog.csdn.net/weixin_42462651/article/details/104914603