一、散列思想
散列表的英文叫Hash Table,也叫哈希表或者Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。
散列表时间复杂度是O(1)的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函数,将键值转化为数组下标,从对应的数组下标的位置取数据。
二、散列函数
散列函数在散列表中起着非常关键的作用。散列函数,顾名思义,它是一个函数。可以把它定义成hash(key),其中key表示元素的键值,hash(key)的值表示经过散列函数计算得到的散列值。
如何改造散列函数?散列函数设计的基本要求:
1、散列函数计算得到的散列值是一个非负整数;
2、如果key1=key2,那hash(key1)==hash(key2);
3、如果key1≠key2,那hash(key1)≠hash(key2)
解释一下上述三点:其中,第一点理解起来应该没有任何问题。因为数组下标是从0开始的,所以散列函数生成的散列值也要是非负整数。第二点也很好理解。相同的key,经过散列函数得到的散列值也应该是相同的。
第三点看起来合情合理,但是在真实的情况下,