当前位置:首页 » 操作系统 » 双散列算法

双散列算法

发布时间: 2022-06-18 12:17:18

‘壹’ 哈希函数的哈希表的概念及作用

哈希表中元素是由哈希函数确定的。将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。表示为:
Addr = H(key)
为此在建立一个哈希表之前需要解决两个主要问题:
⑴构造一个合适的哈希函数
均匀性 H(key)的值均匀分布在哈希表中;
简单以提高地址计算的速度
⑵冲突的处理
冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。即关键字K1≠K2,但H(K1)= H(K2)。均匀的哈希函数可以减少冲突,但不能避免冲突。发生冲突后,必须解决;也即必须寻找下一个可用地址。
解决冲突的方法:
⑴链接法(拉链法)。将具有同一散列地址的记录存储在一条线性链表中。例,除留余数法中,设关键字为 (18,14,01,68,27,55,79),除数为13。散列地址为 (5,1,1,3,1,3,1),哈希散列表如图。
⑵开放寻址法。如果h(k)已经被占用,按如下序列探查:(h(k)+p⑴)%TSize,(h(k)+p⑵)%TSize,…,(h(k)+p(i))%TSize,…
其中,h(k)为哈希函数,TSize为哈希表长,p(i)为探查函数。在 h(k)+p(i-1))%TSize的基础上,若发现冲突,则使用增量 p(i) 进行新的探测,直至无冲突出现为止。其中,根据探查函数p(i)的不同,开放寻址法又分为线性探查法(p(i) = i : 1,2,3,…),二次探查法(p(i)=(-1)^(i-1)*((i+1)/2)^2,探查序列依次为:1, -1,4, -4, 9 …),随机探查法(p(i): 随机数),双散列函数法(双散列函数h(key) ,hp (key)若h(key)出现冲突,则再使用hp (key)求取散列地址。探查序列为:h(k),h(k)+ hp(k),…,h(k)+ i*hp(k))。
⑶桶寻址法。桶:一片足够大的存储空间。桶寻址:为表中的每个地址关联一个桶。如果桶已经满了,可以使用开放寻址法来处理。例如,插入A5,A2,A3,B5,A9,B2,B9,C2,采用线性探查法解决冲突。如图。

‘贰’ 什么是散列法

散列法是把字符串映射到整数的处理,
通常是到一个相对小的范围。一个
“散列函数”
映射一个字符串
(或其它的数据结构)
到一个有界的数字
(散列存贮桶),这个数字可以更容易的用于数组的索引或者进行反复的比较。明显的,
一个从潜在的有很多组的字符串到小范围整数的映射不是唯一的。任何使用散列的算法都要处理
“冲突”
的可能。有许多散列函数和相关的算法被开发了出来;
一个全面的说明已经超出了本文的范围。

‘叁’ 散列算法可以做哪些事

查找并判断状态是否出现过,出现过几次
比如说一个物品a有四个特征,为a[1],a[2],a[3],a[4]
那么令f(a)=a[1]*(p^1)+a[2]*(p^2)+a[3]*(p^3)+a[4]*(p^4)
hash[f(a)]=a;
若又有一个物品b,特征b[1],b[2],b[3],b[4]
f(b)=b[1]*(p^1)+b[2]*(p^2)+b[3]*(p^3)+b[4]*(p^4)
那么a=b时,f(a)=f(b)
反过来f(a)=f(b)时,a很有可能等于b (只要p设定的足够大,a不等于b的几率也很小)
为了节省内存,我们可以让f(a)=f(a)%q;
这样hash数组只需要开q的大小
就算在mod了之后a不等于b的概率也是非常小的(所以出题人一般不怎么能卡Hash,反而还天天考Hash)
像这样一个题:
有n个图,每个图都有m个点,有一些带权的边,询问每个图中的u点能否都不经过权值小于w的边到达v点(n*m<=200000,边数<=300000)
首先,你可以dfs,O(n*m)可以过,
但是如果改成q<=200000次询问,你就不能dfs了
实际上对于一个询问,当权值大于等于w的边全部放完之后就转化为判断此时uv是否都联通,
所以我们考虑离线,将询问按w从大到小,边也是按权值从大到小,边放边,边判断联通,
动态判断联通可以用并查集的按大小启发式合并,id[i][k]表示在第i个图中k所在并查集的头,
i图中u,v联通等价于id[i][u]==id[i][v](表示第i个图,需要枚举n次)。所以可以枚举i判断是不是都联通,总复杂度=O(边数 * log2(n*m) +边数 * n)log2(n*m)为启发式合并的时间复杂度。最后一个n为枚举i的耗费,如果n>500这方法就炸了,想办法优化,这时候就可以用哈希。
设f(u)=id[1][u]*(p^1)+id[2][u]*(p^2)+...+id[n][u]*(p^n) % q
如果id[i][u]=id[i][v](i=1~n) 则f(u)==f(v)
如果f(u)==f(v)则很大可能 id[i][u]=id[i][v](i=1~n)
令Hash[u]=f(u)
则在每次修改id[i][u]时顺便O(1)修改Hash(u)即可O(1)查询,判断Hash[u]是否等于Hash[v].
这样时间复杂度优化为O(边数*log2(n*m)+边数)是一个非常优秀的算法,散列的魅力就在于此,空间换时间,效率高,比赛时只要p和q设的大一些,一些考算法的题可以水个八九十分,还特别好写,不会写炸。

‘肆’ 计算机基础 数据结构 双重散列法 不知道什么意思

(1)先搞清楚几个记号:哈希表容量 m,存储的数据个数 n,装填因子 a = n/m,除留余数法构造的哈希函数一般形式为 H(k) = k % p,这里的 p 一般取不大于 m 的最大素数。
(2)也就是说,p 跟 m 不一定是相等的。至于第二个哈希函数中的 +1,也没什么大不了的,+20 也可以,这个完全是人为规定的,别忘了,在计算哈希地址的时候,无论哈希函数的结果如何,最后还有一个 %m,即形如 (... H(k) ...)%m,来保证哈希地址不会越界。

‘伍’ 散列法的散列算法

也称为哈希函数——哈希的英文意思为“无用信息”,因此哈希函数一词的由来可能是因为最终形成的哈希表里面是各种看起来毫无意义的描述值的混合。除用来快速搜索数据外,散列法还用来完成签名的加密解密工作,这种签名可以用来对收发消息时的用户签名进行鉴权。先用哈希函数对数据签名进行转换,然后将数字签名本身和转换后的信息摘要分别独立的发送给接收人。通过利用和发送人一样的哈希函数,接收人可以从数字签名获得一个信息摘要,然后将此摘要同传送过来的摘要进行比较,这两个值相等则表示数字签名有效。
利用哈希函数对数据库中的原始值建立索引,以后每获取一次数据时都要利用哈希函数进行重新转换。因此,哈希函数始终是单向操作。没有必要通过分析哈希值来试图逆推哈希函数。实际上,一个典型的哈希函数是不可能逆推出来的。好的哈希函数还应该避免对于不同输入产生相同的哈希值的情况发生。如果产生了哈希值相同的情况,称为冲突。可接受的哈希函数应该将冲突情况的可能性降到非常小。

‘陆’ 有关数据结构哈希表的问题

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

hashing定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。

设所有可能出现的关键字集合记为u(简称全集)。实际发生(即实际存储)的关键字集合记为k(|k|比|u|小得多)。|k|是集合k中元素的个数。
散列方法是使用函数hash将u映射到表t[0..m-1]的下标上(m=o(|u|))。这样以u中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在o(1)时间内就可完成查找。
其中:
① hash:u→{0,1,2,…,m-1} ,通常称h为散列函数(hash function)。散列函数h的作用是压缩待处理的下标范围,使待处理的|u|个值减少到m个值,从而降低空间开销。
② t为散列表(hash table)。
③ hash(ki)(ki∈u)是关键字为ki结点存储地址(亦称散列值或散列地址)。
④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列(hashing).
比如:有一组数据包括用户名字、电话、住址等,为了快速的检索,我们可以利用名字作为关键码,hash规则就是把名字中每一个字的拼音的第一个字母拿出来,把该字母在26个字母中的顺序值取出来加在一块作为改记录的地址。比如张三,就是z+s=26+19=45。就是把张三存在地址为45处。
但是这样存在一个问题,比如假如有个用户名字叫做:周四,那么计算它的地址时也是z+s=45,这样它与张三就有相同的地址,这就是冲突,也叫作碰撞!
冲突:两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(synonym)。
冲突基本上不可避免的,除非数据很少,我们只能采取措施尽量避免冲突,或者寻找解决冲突的办法。影响冲突的因素
冲突的频繁程度除了与h相关外,还与表的填满程度相关。
设m和n分别表示表长和表中填人的结点数,则将α=n/m定义为散列表的装填因子(load factor)。α越大,表越满,冲突的机会也越大。通常取α≤1。
散列函数的构造方法:
1、散列函数的选择有两条标准:简单和均匀。
简单指散列函数的计算简单快速;
均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集k随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。
2、常用散列函数
(1)直接寻址法:比如在一个0~100岁的年龄统计表,我们就可以把年龄作为地址。
(2)平方取中法
具体方法:先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。
(3)除留余数法
取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。该方法的关键是选取m。选取的m应使得散列函数值尽可能与关键字的各位相关。m最好为素数(4)随机数法
选择一个随机函数,取关键字的随机函数值为它的散列地址,即
h(key)=random(key)
其中random为伪随机函数,但要保证函数值是在0到m-1之间。
处理冲突的方法:
1、开放寻址法
hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)
其中m为表长,di为增量序列
如果di值可能为1,2,3,...m-1,称线性探测再散列。
如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)
称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列。开放地址法堆装填因子的要求
开放寻址法要求散列表的装填因子α≤l,实用中取α为0.5到0.9之间的某个值为宜。
②二次探查法(quadratic probing)
二次探查法的探查序列是:
hi=(h(key)+i*i)%m 0≤i≤m-1 //即di=i2
即探查序列为d=h(key),d+12,d+22,…,等。
该方法的缺陷是不易探查到整个散列空间。
③双重散列法(double hashing)
该方法是开放寻址法中最好的方法之一,它的探查序列是:
hi=(h(key)+i*h1(key))%m 0≤i≤m-1 //即di=i*h1(key)
即探查序列为:
d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。
该方法使用了两个散列函数h(key)和h1(key),故也称为双散列函数探查法。
2、拉链法
拉链法解决冲突的方法
拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。
3、建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量hashtable[0..m-1]为基本表,另外设立存储空间向量overtable[0..v]用以存储发生冲突的记录。
性能分析
插入和删除的时间均取决于查找,故下面只分析查找操作的时间性能。
虽然散列表在关键字和存储位置之间建立了对应关系,理想情况是无须关键字的比较就可找到待查关键字。但是由于冲突的存在,散列表的查找过程仍是一个和关键字比较的过程,不过散列表的平均查找长度比顺序查找、二分查找等完全依赖于关键字比较的查找要小得多。
(1)查找成功的asl
散列表上的查找优于顺序查找和二分查找。
(2) 查找不成功的asl
对于不成功的查找,顺序查找和二分查找所需进行的关键字比较次数仅取决于表长,而散列查找所需进行的关键字比较次数和待查结点有关。因此,在等概率情况下,也可将散列表在查找不成功时的平均查找长度,定义为查找不成功时对关键字需要执行的平均比较次数。
注意:
①由同一个散列函数、不同的解决冲突方法构造的散列表,其平均查找长度是不相同的。
②散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。因此在设计散列表时可选择α以控制散列表的平均查找长度。
③ α的取值
α越小,产生冲突的机会就小,但α过小,空间的浪费就过多。只要α选择合适,散列表上的平均查找长度就是一个常数,即散列表上查找的平均时间为o(1)。
④ 散列法与其他查找方法的区别
除散列法外,其他查找方法有共同特征为:均是建立在比较关键字的基础上。其中顺序查找是对无序集合的查找,每次关键字的比较结果为"="或"!="两种可能,其平均时间为o(n);其余的查找均是对有序集合的查找,每次关键字的比较有"="、"<"和">"三种可能,且每次比较后均能缩小下次的查找范围,故查找速度更快,其平均时间为o(lgn)。而散列法是根据关键字直接求出地址的查找方法,其查找的期望时间为o(1)。
例子:例子:选取哈希函数h(k)=(3k)%11,用线性探测再散列法处理冲突。
试在0~10的散列地址空间中,对关键序列22,41,53,46,30,13,01,67构造哈希表,并求等概率情况下查找不成功的平均查找长度asl。

‘柒’ 请教哈希函数双散列是如何计算的

关键字K1≠K2,但H(K1)= H(K2)。均匀的哈希函数可以减少冲突,但不能避免冲突。发生冲突后,必须解决;也即必须寻找下一个可用地址。在哈希表中,不同的关键字值对应到同一个存储位置的现象。

开始插入59,i=0,h(59,0)=(59 mod 11 + 0*(1+59 mod 9)) mod 11=4,位置4与37冲突,继续计算。

冲突1次,i=1,h(59,1)=(59 mod 11 + 1*(1+59 mod 9)) mod 11=10,位置10空,59插入到位置10。

如果再冲突,那么i=2,继续计算,以此类推。

25和72类似。

(7)双散列算法扩展阅读:

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key)=random(key),其中random为随机函数。通常用于关键字长度不等时采用此法。

若已知哈希函数及冲突处理方法,哈希表的建立步骤如下:

Step1、取出一个数据元素的关键字key,计算其在哈希表中的存储地址D=H(key)。若存储地址为D的存储空间还没有被占用,则将该数据元素存入;否则发生冲突,执行Step2。

Step2、根据规定的冲突处理方法,计算关键字为key的数据元素之下一个存储地址。若该存储地址的存储空间没有被占用,则存入;否则继续执行Step2,直到找出一个存储空间没有被占用的存储地址为止。

‘捌’ 散列算法的算法思想

我也只能说说思想

散列算法的算法就是争取一个萝卜一个坑的原则

比如说有5个数 12,25,30,45,50,这几个数有个规律,就是十位数都不相同,

如果我设置一个散列函数f(value)=value/10;平常的时候,我们查找50,要比较

5次(其他算法可能不同),这里用散列算法只需要1次,就是解散列函数,key=50/10

=5,要找的数就在第5个位子.但是上面问题还是很多的,比如说查找55呢?就会出

错<因为55解散列函数之后,也是在第5个位子>,还有等等等问题,很显然这个是我

散列函数没设置好,当你把散列函数设置好了后,由于数据的庞大,冲突很有可能

产生,那么就需要我们来处理冲突了,所以写散列算法就是设置好的散列函数和

处理冲突的过程.这里散列算法涉及的查找就跟查找的数量无关,跟冲突率有直接

的关系

‘玖’ 散列算法的概念

在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的“散列”或“消息摘要”(Message digest)。一个安全的哈希函数H必须具有以下属性:
l)H能够应用到大小不一的数据上。
2)H能够生成大小固定的输出。
3)对于任意给定的x,H(x)的计算相对简单。
4)对于任意给定的代码h,要发现满足H(x)=h的x在计算上是不可行的。
5) 对于任意给定的块x,要发现满足H(y)=H(x)而y=x在计算上是不可行的。
6)要发现满足H(X)=H(y)的(X,y)对在计算上是不可行的

‘拾’ 二次探测散列法

二次再散列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函数或者对冲突结果进行处理的方法。

散列函数的选择有两条标准:简单和均匀。

简单指散列函数的计算简单快速;

均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集K随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。

(10)双散列算法扩展阅读:

设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。

散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(|U|))。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。

其中:

① h:U→{0,1,2,…,m-1} ,通常称h为散列函数(Hash Function)。散列函数h的作用是压缩待处理的下标范围,使待处理的|U|个值减少到m个值,从而降低空间开销。

② T为散列表(Hash Table)。

③ h(Ki)(Ki∈U)是关键字为Ki结点存储地址(亦称散列值或散列地址)。

④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列(Hashing)

参考资料来源:网络-二次探测散列法

热点内容
如何制作薯仔服务器 发布:2024-11-07 05:27:49 浏览:811
机器码反编译教程 发布:2024-11-07 05:24:17 浏览:213
动迁三块砖算法 发布:2024-11-07 05:18:06 浏览:826
视窗压缩 发布:2024-11-07 04:45:06 浏览:887
fc2点此访问 发布:2024-11-07 04:45:04 浏览:760
上传吊牌图 发布:2024-11-07 04:38:48 浏览:919
密码学什么概念 发布:2024-11-07 04:38:48 浏览:848
linuxpdf转word 发布:2024-11-07 04:37:06 浏览:213
安卓手机为什么用ufs 发布:2024-11-07 04:15:09 浏览:559
数据库删除所有表 发布:2024-11-07 04:13:55 浏览:576