HashTable的Python实现

HashTable是一种非常常见且用途十分广泛的数据结构,使用hashtable可以大大提高数据的检索速度,是一种非常优秀的结构

Hash算法:

既然说到hashtable,首先明白hash是什么意思,hash的中文翻译是散列


hash是一类算法的统称,散列函数(或散列算法,又称为哈希函数,是一种从任何一种数据中创建小的数字指纹的方法

hash函数就是对某一个复杂算法的计算,然后得到一个不是那么复杂的数据,但是这个新的数据又能够代表他的原始数据,这个就不难理解维基百科中称哈希函数创建的是数据的指纹了,很容易理解,现实生活中指纹是对某一个特定的人的代表,而相对整个人的处理,指纹的处理则简单的多

和每个人的指纹都不同不一样,不同的数据的散列值有可能会一样,不同的数据产生了同样的散列值的情况称为碰撞,优秀的哈希函数应该尽可能的降低产生数据碰撞的几率。

正是因为碰撞的存在,所以hash函数是不能从散列值计算出原值,与此同时,散列函数不具有可逆性,这个特性使得hash函数在密码学领域得到了极其广泛的应用

一个典型的hash算法是将整数除以一个常量并且求余法,得到的余数就是散列值。

 

hashtable

当我们在对数据进行增删改查操作的时候,如果数据本身就很大,则会严重的降低数据的操作效率,hashtable的核心思想是对于每一个数据,根据某种给定的hash函数,计算出数据的散列值,然后根据散列值进行查找。因为散列值在设计之初就是十分精简的,所以能够很好的提升数据的操作速度。

使用散列值进行值的查找已经很好能够很好的提升数据的查询速度,但这样仍然存在问题,问题的起因就是因为碰撞。

由于散列函数本身的性质,导致多个不同的数据可能会有相同的散列值,此时光靠散列值肯定无法进行值的查找,一种比较

典型的解决方法就是通过链表这种数据结构来保存散列值相同的数据

当进行数据插入到哈希表的时候,如果发现该数据的散列值在之前已经存在,则把该散列值一样的数据做成一个链表

把最新的数据插入到链表的尾部,而该链表本身则会插入到槽中,这是一种由数组和链表组合的数据结构。

 

 

如上图所示,左边的槽保存的是散列值,拥有同样的散列值的数据会被存放在同一个槽中,而槽的右边则是一个链表,用来把散列值相同的数据给区分并保存起来。

我们可以把 HashTable 类比为一本书,这里的散列值对应的就是书的目录,我们可以把书中具体的数据用目录的中的页码表示出来。书的目录会存在很多的章节,这里章节就对应的是 HashTable 中的槽部分,同样,书也会存在多个小节属于同一个章节的情况,所以每个槽(即章节)又可以由多个链表的节点(对应目录中的小节)组成。

posted @ 2020-08-18 02:56  风不再来  阅读(815)  评论(0编辑  收藏  举报