全域哈希:
解决普通哈希的缺点: 对任意的hash函数h,总存在一组keys,使得对某个槽i总可以找到一组键值,让他们都映射到同一个槽里面,这样效率就跟离链表差不多了。
解决的思想就是:(加入随机性)
独立于键值,随机的选择hash 函数。这就跟快排中为避免最差情况时随机化版本差不多。
但hash函数类有指定的特点:对于任意的不相等key的x和y, 从哈希函数集中选择一个哈希函数,这两个key,发生冲突的概率是1/m。(m为槽数)
好处:设h是从哈希函数全域集H中随机选出的函数h,h被用作把任意n个键映射到表T的m个槽中,对给定键值x,E[#collision with x]<n/m | 发生碰撞的期望次数小于n/m,即装载因子α。
构造方法:
https://www.jianshu.com/p/226dc1f79114
完全哈希:
当键值是static(即固定不变)的时候,我们可以涉及方案使得最差情况下的查询性能也很出色,这就是完全哈希。
完全哈希可以在最坏情况下以O(1)复杂度查找,性能非常出色的。完美哈希的思想就是采用两级的框架,每一级上都用全域哈希。
将第一级全域哈希冲突的元素散列到二级哈希(槽数扩大为冲突元素数量的平方)上,使其不再冲突(冲突的几率<1/2),若继续冲突,则尝试其他哈希函数,很容易就得到不冲突的哈希函数。(数据为静态)
同时,在一个完全哈希方案中,存储所有二次哈希表所需的存储总量期望值小于2n(空间复杂度期望为线性),所以只需从全域哈希函数类中随机选择哈希函数,尝试几次就可以快速找到一个所需存储量较为合理的函数。