链地址法实现一个很简单的hash表
[1]hash函数定义
根据key,计算出key对应记录的储存位置
position = f(key)
函数f就是hash函数
[2]hash冲突定义
不同的key可能得到相同的position。原因为key值的范围过大。如int.
如果构造一个完全没有冲突的表。那么对应的地址空间就是4G,这是根本不
实现的。为了处理这个问题。就允许不同的key可以有相同的position。
[3]hash表定义
映射的集合
[4]设计一个好的hash函数非常重要
由[2]可知,一个好的hash函数可以使positions集中分布在某一段内存地址范围内。
并且position在这段地址范围内存尽量均匀。这样每个key对应的position就尽可能
少了,即hash冲突少。查找就会快一点。
[5]所谓的hash桶定义
就是预分配的一段连续的储存空间
[6]处理冲突的方法
(1)开放定址法:就是先指定一个桶,然后position = f(key,d),如果postion已经存在了,改变参数d,
继续计算position = f(key,d),直到postion不存在
d的不同取值的算法有:线性探测再散列,二次探测再散列,伪随机探测再散列。
听这名字觉得好高深哦。实际上, 就是为了更高效地计算出没有使用的position
(2)链地址法
就是把position相同的item按插入的先后顺序组成一个链表
现用链地址法实现一个很简单的hash表