因为散列表的内容过于多,所以我打算分为三篇文章来讲解散列表。
散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中。
在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置。
散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,散列主要是面向查找的存储结构。
上面提到的某个函数,被称为散列函数,它负责记录存储位置和它的关键字之间的对应关系f 。
散列函数,又称为哈希(Hash)函数
查找时:
key 为关键字,f 为散列函数,f(key)为存储位置
在存储时,通过散列函数计算纪录的散列地址,并按此散列地址存储该记录。
假设一个场景,你有一个快递要寄出去,快递小哥帮你贴了快递单号,然后他让你放到驿站里面的桌子上。
但是你一进驿站里面,发现有很多张桌子,你并不知道他说的是哪一张。
此时有一个人上来问你是不是要寄快递的,并且问你有没有贴快递单号,你将单号给他之后,他帮你放到了一个指定的桌子上。
这个就是散列表的存储过程。快递单号就是关键字,驿站里的那个人就是散列函数,而快递放到的桌子就是最终得出的指定地址。
当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。
还是那个场景,但是此时的你不是寄快递,而是来拿好朋友给你寄来的麻辣鸭翅。
你直接进入了那个放快递的驿站里,将快递单号给了那个人,那个人通过你的快递单号来找到你的快递,然后拿给了你。
查找的步骤和存储的步骤是一样的,不过我们使用的用途不同而已。我们都是将关键字给予散列函数,通过散列函数计算得出的存储位置来存储 / 查找。
再简单来说,散列函数起到的作用就是,通过计算得出将东西存哪去,从哪拿?
1、计算简单
散列函数的计算时间不应该超过其他查找技术与关键字比较的时间。
2、散列地址分布均匀
解决冲突最好的办法就是尽量让散列地址均匀地分布在存储空间中。
保证存储空间的有效利用,并减少为处理冲突而耗费的时间。
在上面提出的原则里面,我们看到了一个新词“冲突”,那么冲突是什么?
冲突就是,两个不同的关键字,但是通过散列函数得出来的地址是一样的。
key1 ≠ key2,但是f(key1)= f(key2)
同义词
此时的key1 和key2就被称为这个散列函数的同义词
那可不行啊,一件单人间怎么可以住两个人呢?
别担心,这个问题自然已经被神通广大的大佬们解决了。
待我下篇文章慢慢道来~
最后我们总结一下散列表的优缺点:
散列技术最适合的求解问题是查找与给定值相等的记录:
以上就是本篇文章的所有内容了,如果觉得有帮助到你的话,
麻烦动动小手,点赞收藏转发!!!
你的每一次点赞都是我更新的最大动力~
我们下期再见!