全域哈希和完全哈希

1、直接映射表

查找数据时,直接定位,时间复杂度为:O(1);

局限性:浪费大量的内存空间;

2、哈希表

(1)、用一个哈希函数Hash()来随机映射那些键;

抽象模型

(2)、哈希冲突时:

i、链地址法,时间复杂度最坏:O(n);

简单均匀哈希的时间复杂度:O(1+a);a:装载因子

哈希函数的选取:除留余数法;

ii、开放寻址法,没有链表;

利用多次哈希函数,探测空的位置,直到找到一个可以存放元素的位置即可;探查序列很重要!!!

插入、查询就根据探查序列比较简单,删除比较难做;

探测序列:a、线性探测:一个挨一个位置的探测,往下扫描;

探测序列:b、二次哈希:2个哈希函数的和扫描;

哈希表越满,其探查效率越低;

3、哈希函数的所有键映射同一个槽,此时查询效率极为低下。

(1)、问题关键:选择哈希函数,要随机选择,与输入的哈希运算的键保存独立,程序员本身也不能确定在实际运行时会用到哪一个哈希函数,无法预测随机数的输出;----->全域哈希

(2)、全域哈希解决的问题:所有键都相同,此时随机选择哈希函数将会使其映射到不同的槽中;

哈希函数集H中随机地选择函数h,均匀的分布在哈希表中;

(3)、全域哈希的构造:

i、槽的总数为m = 质数时成立,k = <k_0,k_1,.....,k_r>把任意的键分解为r+1位,可以把k看成k_0,k_1......k_r(k_i >= 0 && k_i <= m-1),k用"m进制"来表示;k不断除m,取余在除(进制转换法)

ii、构造一个a = <a0,a1,a2....ar>,随机地从(0,1,2,....m-1)中选取元素分配到a集合中;

哈希函数集:k x a,k中的每一项和a中的每一项相乘,再把乘积全部加起来,在对m取余,就得到分配的槽数;哈希函数集的大小:m^(r+1);

(4)、全域哈希是用随机函数的思想,但是有很小很小的概率还是会冲突的,解决方案:完全哈希;

4、完全哈希

使用二级结构,在每一级都会用全域哈希,第一级可能会有冲突,但是第二级就没有了;

(1)、算法模型

(2)、算法分析:

  时间复杂度:O(1);

  所需的存储空间为:O(n);



时间: 2024-11-08 17:24:31

全域哈希和完全哈希的相关文章

哈希函数和哈希表综述 (转)

哈希表及哈希函数研究综述 摘要 随着信息化水平的不断提高,数据已经取代计算成为了信息计算的中心,对存储的需求不断提高信息量呈现爆炸式增长趋势,存储已经成为急需提高的瓶颈.哈希表作为海量信息存储的有效方式,本文详细介绍了哈希表的设计.冲突解决方案以及动态哈希表.另外针对哈希函数在相似性匹配.图片检索.分布式缓存和密码学等领域的应用做了简短得介绍 哈希经过这么多年的发展,出现了大量高性能的哈希函数和哈希表.本文通过介绍各种不同的哈希函数的设计原理以及不同的哈希表实现,旨在帮助读者在实际应用中,根据问

一致性哈希 与 普通哈希对比

普通哈希算法 假如有cache主机5台分别为cacheA.cacheB.cacheC.cacheD.cacheE 当程序进行hash时,首先每个节点要根据自己的唯一参数哈希出一个值来(如根据ip进行哈希) 主机哈希完成后形成的哈希值如下 cacheA       0 cacheB       1 cacheC       2 cacheD       3 cacheE       4 主机形成哈希值后,我们以缓存来做实例,比如某个用户登录后会有一个唯一的pin值,然后根据 这个pin值进行has

哈希桶处理哈希冲突

哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),我们可以把每个key的位置看作是一个指针,该指针所指向的位置里放了一个链表,可以认为是指针数组,故该方法也叫开链式. 相比闭散列,哈希桶提高了空间利用率:在实现哈希表时,常见的方法是线性探测.二次探测,这两个算法的具体实现可以查看我的博客.但是这两个算法有一个共同点就是:空间利用率低.为什么这么说呢?线性探测.二次探测的高效性很大程度上要取决于它的载荷因子,载荷因子即:存放关键字个数 / 空间大小. 通过查阅资料,我发现,使用素数做除数可

算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p

数据结构与算法——哈希函数与哈希表等(1)

认识哈希函数和哈希表的实现 MD5 表达16^16范围的值 SHal 表达16^32范围的值 输入相同,即输出相同,不随机 不同的输出,输出相同 均匀性,离散性 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; public class HashMap { public static void main(String[] args) {

哈希函数和哈希表

哈希函数:将一个哈希表中的关键字映射成该关键字对应地址的函数.而hash函数应尽量减少冲突 哈希表建立了关键字和存储地址的映射. 哈希函数的方法: 直接定址法,除留余数法,数字分析法,平方取中法,折叠法 处理冲突的方法 开放定址法: 线性探测(容易聚集和堆积) 平方探测 拉链法:

【Python算法】哈希存储、哈希表、散列表原理

哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中. 查找时再根据要查找的关键字采用同样的函数计算出哈希地址,然后直接到相应的存储单元中去取要找的数据元素即可. 哈希表的应用: 哈希表(hash table)是实现字典操作的一种有效的数据结构. 尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n). 然而实际应用中,散

哈希表与哈希函数 C实现

<pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"> <strong>散列表</strong>(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通

哈希表和哈希函数

一.哈希表 通过记录的存储位置和它的关键字之间建立一个确定的对应关系 f  以及处理冲突的方法,使得每个关键字和结构中一个唯一的存储位置相对应.这样对于关键字 K  根据对应关系 f  ,就可以找到存储在 f(K) .称这种对应关系f 为 哈希函数,按照这种方法建立的表称为哈希表. 1.1 原理: 通过记录的存储位置和它的关键字之间建立一个确定的对应关系 f ,使得每个关键字和结构中一个唯一的存储位置相对应.这样对于关键字 K  根据对应关系 f  ,就可以找到存储在 f(K) .称这种对应关系