【细谈数据结构】最最最详细的散列表(哈希表)讲解!!!(一)

细谈散列表系列一共有三篇文章

1、散列表的概述
2、散列函数的作用与构造
3、散列表查找的代码实现

因为散列表的内容过于多,所以我打算分为三篇文章来讲解散列表。

本篇的重点是,散列表的概述


1、什么是散列表?

散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中。

在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置。

散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,散列主要是面向查找的存储结构


2、散列表是如何实现查找的?

上面提到的某个函数,被称为散列函数,它负责记录存储位置和它的关键字之间的对应关系f

散列函数,又称为哈希(Hash)函数

  • 记录的存储位置和它的关键字之间的对应关系f 被称作散列函数
  • 散列技术是一种新的存储技术
  • 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f
  • 使得每个关键字key 对应一个存储位置f(key)

查找时:

  • 根据这个确定的对应关系找到给定值key 的映射f(key)
  • 若找到集合中存在这个记录,则必定在f(key)的位置上。

key 为关键字,f 为散列函数,f(key)为存储位置


3、散列表查找步骤

在存储时,通过散列函数计算纪录的散列地址,并按此散列地址存储该记录。

假设一个场景,你有一个快递要寄出去,快递小哥帮你贴了快递单号,然后他让你放到驿站里面的桌子上。

但是你一进驿站里面,发现有很多张桌子,你并不知道他说的是哪一张。

此时有一个人上来问你是不是要寄快递的,并且问你有没有贴快递单号,你将单号给他之后,他帮你放到了一个指定的桌子上。

这个就是散列表的存储过程。快递单号就是关键字,驿站里的那个人就是散列函数,而快递放到的桌子就是最终得出的指定地址。


当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。

还是那个场景,但是此时的你不是寄快递,而是来拿好朋友给你寄来的麻辣鸭翅。

你直接进入了那个放快递的驿站里,将快递单号给了那个人,那个人通过你的快递单号来找到你的快递,然后拿给了你。

查找的步骤和存储的步骤是一样的,不过我们使用的用途不同而已。我们都是将关键字给予散列函数,通过散列函数计算得出的存储位置来存储 / 查找。

再简单来说,散列函数起到的作用就是,通过计算得出将东西存哪去,从哪拿?


4、好的散列函数的两个原则:

1、计算简单
散列函数的计算时间不应该超过其他查找技术与关键字比较的时间。

2、散列地址分布均匀
解决冲突最好的办法就是尽量让散列地址均匀地分布在存储空间中。

保证存储空间的有效利用,并减少为处理冲突而耗费的时间。


5、冲突是什么?

在上面提出的原则里面,我们看到了一个新词“冲突”,那么冲突是什么?

冲突就是,两个不同的关键字,但是通过散列函数得出来的地址是一样的
key1 ≠ key2,但是f(key1)= f(key2

同义词
此时的key1 和key2就被称为这个散列函数的同义词

那可不行啊,一件单人间怎么可以住两个人呢?

别担心,这个问题自然已经被神通广大的大佬们解决了。
待我下篇文章慢慢道来~


6、总结

最后我们总结一下散列表的优缺点:

散列技术最适合的求解问题是查找与给定值相等的记录:

  • 优点:简化了比较过程,提高了查找效率
  • 缺点:不具备很多常规数据结构的能力
    • 单个关键字不能记录多条记录
    • 不适合范围查找

以上就是本篇文章的所有内容了,如果觉得有帮助到你的话,
麻烦动动小手,点赞收藏转发!!!
你的每一次点赞都是我更新的最大动力~

我们下期再见!

猜你喜欢

转载自blog.csdn.net/weixin_43776724/article/details/112912006