哈希表的使用

哈希表

基本概念

哈希算法主要目的是提高搜寻特定元素的效率。

所谓哈希算法是指根据一个规则或一个算法,将对象相关信息,如对象的字符串、对象本身,映射成一个唯一的数值,这个数值就是哈希值,上述规则或算法在计算机领域称函数,此函数又称哈希函数。

一个好的哈希函数,会有下列特质:

(1)每个字符串一定可以产生唯一的哈希值。

(2)相同字符串在不同时间输入所产生的哈希值一定相同。

(3)不论字符串大小一定可以产生相同长度的哈希值。

在程序设计领域,需要上述的表格,可以方便我们执行高效率的数据查询与操作。可以将表格改写成键值的配对关系,在python中就是字典数据格式。

上述数据结构提供了key:value的映射关系,我们称之为哈希表,只要有key就可以得到value,时间复杂度是O(1)。

哈希表转成数组

其实本质上哈希表也是一个数组,如何将键值配对的内容存至数组,其实重点就是将哈希码转成数组索引。首先我们可以计算键的哈希值,假设数组长度是n,可以用求余数方式计算键的索引值。

有时候哈希值经过余数处理,产生的索引位置已经有数据了,这称作碰撞。使用链表将数据接在已知数据的后面,这个方法称链结法。

除了可以用链表处理外,也可以用开放寻址法:发生碰撞时寻找候补位置,如果候补位置已满,继续往下找寻,直到找到新的位置。如线性探测法,是从数组中往下找寻空的索引,然后将数据放入空的索引。

使用哈希表长时间插入数据后,数据经过计算发生碰撞的机会越来越高,此时大量数据拥有相同的索引值。当上述情况发生时,对于后续的插入与搜寻会造成效率的降低,此时可以建立新的且容量较大的空哈希表,然后讲数据映射到新的哈希表。

负载系数=哈希表的项目数/哈希表的数组容量。当负载系数超过1时,表示哈希表的项目超过了数组的容量。一般情况下,当负载系数超过0.75时,哈希表的数组就需要扩充了。

使用哈希表插入、删除、搜寻的效能是O(1)。我们要插入一个商品项目到数据库内,懂了哈希算法后,可以先计算这个数据的哈希值,这样一下子就可以定位到数组的索引地址,如果这个索引地址目前没有元素,就表示可以直接存储不用再比较。

你可能感兴趣的:(算法,散列表,哈希算法,数据结构)