散列表是实现字典的一种数据结构,是普通数组的推广,
原理是根据关键字计算出下标,用链接的方法解决冲突。
11.1 直接寻址表
如果关键字全集比较小,可以直接寻址。
11.2 散列表
用散列函数h, 计算关键字k所在的位置为 h(k)。
这一步可以产生冲突,将不同的关键字映射到同一个槽内。
介绍两种解决冲突的方法:链接法、开放寻址法
链接法:
冲突链接到同一个链表中,
插入、删除的时间都是O(1),(删除不需要搜索)。双链表删除比较快。
查找性能?
n个元素,m个槽位,装载因子 n/m
只要槽位与元素数量成正比,那么查找时间就是O(1)
11.3 散列函数
好的散列函数的标准:均匀,相近的最好不在一起,
可以将关键字转换为自然数。以下的针对关键字为自然数的情况。
除法散列法: h(k) = k mod m。如果m是2的n次幂的话要小心。
乘法散列法:h(k) = m(kA mod 1) 其中A是一个0-1之间的小数,
优点:对m的选择不太关键,可以选择2的幂次,
全域散列法:待学习
11.4 开放寻址法
待学习