7、散列表

一、什么是散列表?

      问题:现在我们需要为一家超市建立一个结账系统,我们应该考虑用哪一种数据结构?

      思考:由于结账系统多用于查询,我们可以考虑使用数组。在数组中需要同时储存商品名和对应的价格,我们可以再数组中内嵌子数组,把一个商品名和对应价格同时保存在一个子数组中,最后对所有数组排序。查询是速度为O(log2n)。

      反思:①数组无法储存具有映射关系的数据;②超市中的商品成千上万,即使查询速度为对数速度,当记录的项目多时查询起来也非常耗时。

      针对反思中的两点,我们想:如果有一种数据结构,能够储存具有映射关系的数据,而且无论项目有多少,其查询数据的速度都是1该有多好。散列表就是实现了这种功能的数据结构。它能够储存具有映射关系的数据,而且查询速度永远是1.

二、散列函数

      在数组中,利用索引来查找数据这一操作是瞬间完成的事情。散列函数能够把一个数据转化成一个具体的数字,而这个数字就是储存数据的数组中的索引,这样我们就可以把数据保存在数组中索引的位置了。查找数据时只要用散列函数得出索引,查找的速度就永远是1了。

      所以,散列表是散列函数与数组相互配合工作的:散列函数转化数据,数组储存数据。

      这样看来,散列函数必须足够强大,能够把数据转换成互不相同的数字。

三、散列表与数组、链表

      散列表是我们在数组、链表之后学习的第一种有额外逻辑的数据结构:数组、链表都是把数据直接映射到内存里,而散列表是使用散列函数确定数据的储存位置。

      散列表是一种会被我们广泛引用的数据结构,一般一门语言中通常都提供了散列表的实现,在python中的散列表是字典。

四、散列表的应用

      1、用于具有映射关系和快速查找的应用,如电话簿、商品价格列表、DNS解析表;

      2、用于防止重复的应用,如投票系统。

五、冲突

      冲突:给两个键分配的相同的储存位置;

      原因:散列函数不够完美,不能做到对不同数据生成不同的数字;

      解决方法:在分配到相同的同一位置,用链表储存数据。

猜你喜欢

转载自www.cnblogs.com/lqxing1994/p/9254429.html