前面我们了解二叉树查找,虽然二叉树的查找已经很快了,但是仍然需要O(logn)的时间复杂度。我们能不能更快呢?我们就想到了一个方法,如果我们能够把所有查找的键转化为一个唯一的数字,那么我们就可以采用数组的形式来存放键和值,那么存取的速度就会非常快了,时间复杂度是O(1)。
如果没有内存限制,我们可以做一个超大的数组来存放,那么所有查找都只需要一次访问就可以得到了。
但是显然,我们并没有这么大的内存来存放数组。所以我们只能选择一个折中的办法,就是采用散列表的形式。
散列表的实现需要解决以下两个问题:
1.散列函数
2.冲突解决
散列函数
散列函数需要满足什么条件呢?
1.一致性
2.易于计算
3.分布均匀
一致性
对于同一个键,使用散列函数计算得到的数组下标,每次计算都应该是一致的。
易于计算
使用散列函数计算数组的下标应该是高效的,否则就失去了散列表的特性。
分布均匀
使用散列表计算多个键得到的下标应该分布均匀,否则也会失去散列表的高效性。
因为键可能是各种各样类型的键,考虑到分布均匀的特征,我们应该将整个键映射成一个下标,而不是只使用键的一部分。例如:Date类型的键,应该充分考虑到day,month,year所有的因素。
幸运的是,对于java,它提供了hashCode()函数,对于大部分的数据类型,我们不必操心他们的散列函数。当