hashtable即散列表,也叫哈希表,它对元素的插入、删除和访问操作具有常数时间复杂度的表现,这种表现不依赖于输入元素的随机性。
1 哈希函数的作用概述
假如使用哈希存储数据,且该所有的数据是16-bits且不带正负号,范围是0~65535,那么使用一个array就可以满足上述期望。具体操作:
- 首先配置一个array,大小为65536,并把所有元素的值初始化为0;每个元素的值为元素出现的次数。
- 如果插入元素i,那么就执行++A[i];
- 如果删除元素i,那么就执行--A[i];
- 如果访问元素i,那么就执行A[i]。
上述操作时间复杂度均为常数时间,这种解法的额外负担是array的空间和初始化时间。且这个解法存在两种问题:
- 如果元素是32-bits,那么array的大小为2的32次方,即4GB,占用空间实在是太大了;
- 如果元素的类型是字符串(或其他)而非整数,将不能作为array的索引。
第一个问题是实实在在存在的问题,难以解决;第二个问题可通过把字符串转换为ASII来解决,但是仍可能会产生巨大的数字,比如"jjhou"的索引是:
这太不切实际了,更长的字符串会导致更大的数字,这就回归到第一个问题:array的大小可能会巨大。
为解决上述array空间巨大的问题,我们使用