hash表及其应用.ppt_第1页
hash表及其应用.ppt_第2页
hash表及其应用.ppt_第3页
hash表及其应用.ppt_第4页
hash表及其应用.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HASH函数及其应用,雅礼 朱全民,问题一,读入n个正整数,每个数小于109 查询某个数是否在这n个数中出现 一共查询m次 n=100000 m=100000,in.txt 5 - 5个数 8 1 6 3 5 3 - 询问3次 3 6 9,out.txt YES YES NO,分析,这题可以先对n个数进行快速排序,然后对于每次询问,用二分查找解决。 有没有更快的做法?,什么是HASH?,哈希表是一种高效的数据结构 。 散列方法是使用函数h将U映射到表T0.m-1的下标上(m=O(|U|))。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查

2、找。,一、整数的Hash函数 构造方法(1),1直接取余法 关键字k除以m,取余数作为在Hash表中的位置。函数表达式可以写成: h(k)=k mod m 一般m选择为素数,一、整数的Hash函数 构造方法(2),2乘积取整法 关键字k乘以一个在(0,1)中的实数(最好是无理数),得到一个(0,1)之间的实数;取出其小数部分,乘以m,再取整数部分,即得K在Hash表中的位置。函数表达式可以写成: 例如 就是一个好的选择。,一、整数的Hash函数 构造方法(3),3平方取中法 把关键字K平方,然后取中间的 位作为Hash函数值返回。由于K的每一位都会对其平方中间的若干位产生影响,因此这个方法的效

3、果也是不错的。但是对于比较小的K值效果并不是很理想,实现起来也比较繁琐。为了充分利用Hash表的空间,M最好取2的整数次幂。例如,表容量M=24=16,关键值K=100,那么 h(k)=8,回到问题一,n最多为100000 flag数组不开到109,但可以开flag1.300000,可用取余法,解决冲突,将数组改为链表,问题二,问题一中的正整数改称字符串 (每个字符串的长度不超过20) 还是输入n个字符串,一共m次询问,in.txt 4 - 5个字符串 cat banana apple dog 3 - 询问3次 banana fruit pet,out.txt YES NO NO,二、字符串的

4、Hash函数 构造方法,字符串本身就可以看成一个256进制(ANSI字符串为128进制)的大整数,因此我们可以利用直接取余法,在线性时间内直接算出Hash函数值。 为了保证效果,仍然不能选择太接近2n的数;尤其是当我们把字符串看成一个2p进制数的时候,选择m= 2p -1会使得该字符串的任意一个排列的Hash函数值都相同。,排列的Hash函数,让排列与数1-A(m,n)之间建立一一对应的关系。 引理 从0到n!-1的任何自然数可唯一地表示为 全排列与自然数之一一对应 不妨设n个元素为1,2,.,n。对应的规则如下:设序列 (an-1 , a1) 对应的某一排列,其中ai可以看做是排列p中数i+

5、1所在位置右边比i+1小的数的个数。以排列4132为例,它是元素1,2,3,4的一个排列。4的右边比4小的数的数目为3,所以a3=3。3右边比3小的数的数目为0,即a2=0 。同理a1=1 。所以排列4213对应于变进制的301,也就是十进制的19;反过来也可以从19反推到301,再反推到排列4213。,Hash函数的冲突,冲突 两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。 安全避免冲突的条件最理想的解决冲突的方法是安全避免冲突。要做到这一点必须满足两个条件:其一是|U|m其二是选择合适的散列函数。 这只适用于|U|较小,且关键字

6、均事先已知的情况,此时经过精心设计散列函数h有可能完全避免冲突。 影响冲突的因素 冲突的频繁程度除了与h相关外,还与表的填满程度相关。 设m和n分别表示表长和表中填人的结点数,则将=n/m定义为散列表的装填因子(Load Factor)。越大,表越满,冲突的机会也越大。通常取1。,解决冲突的方法,开散列方法( open hashing,也称为拉链法,separate chaining ) 闭散列方法( closed hashing,也称为开地址方法,open addressing )。 这两种方法的不同之处在于: 开散列法把发生冲突的关键码存储在散列表主表之外, 而闭散列法把发生冲突的关键码存

7、储在表中另一个槽内。,拉链法,开散列方法的一种简单形式是把散列表中的每个槽定义为一个链表的表头。散列到一个特定槽的所有记录都放到这个槽的链表中。,线性探查法(Linear Probing),将散列表T0.m-1看成是一个循环向量,若初始探查的地址为d(即 h(key)=d),则最长的探查序列为:d,d+l,d+2,m-1,0,1,d-1 .即:探查时从地址d开始,首先探查Td,然后依次探查Td+1,直到Tm-1,此后又循环到T0,T1,直到探查到 Td-1为止。探查过程终止于三种情况: (1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中); (2)若当前探查的单元中含有ke

8、y,则查找成功,但对于插入意味着失败; (3)若探查到Td-1时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。,思考题1 : distinct,【试题描述】 陶陶为了给一道平面几何题出数据,需要产生 N 个点 (xi,yi)。已知x,y是由伪随机函数顺序产生,即: Xi+1 = (Xi*Ax+Bx+i) mod Cx Yi+1 = (Yi*Ay+By+i) mod Cy X1, Ax,Bx,Cx,Y1, Ay,By,Cy 是事先给定 最少要产生前多少项时,正好有 N 个不相同的点。 【数据范围】 1=N=1,000,000, 其它所有数据都在1.1,000,000

9、,000范围内。,分析,数据最大为106,O(N2)超时。每次要求查找某个数,由于是动态的,不好先排序。 用O(NlogN)时间复杂度即可,可以用平衡树之类。但现有编程复杂度高,时间系数也大。 对快速插入、查找操作,比较简洁有效的方法是hash表算法。,【试题描述】 农民约翰打算建一个新的矩形谷仓。但是,矩形谷仓的4个角落不能在落在软土路基上,只能落在一些固定点上。现在,他已经找到地面上有N(4 = N = 1,000)个点,角落只可以落在这些点上。他想知道依次每加多一个点,可以建立新谷仓的方法数量,请你帮助他找到答案。 【数据范围】 1= N = 1,000 所有的x,y都不会超过16,00

10、0。 所有点都是不同的。,思考题2:Allbarns,分析,从样例知道矩形是可以不平行于X,Y轴的。 N=1,000, 可以用O(N*N)算法。可以先产生所有边。 从几何知识知道,如果两条线段长度相同,中点重合,则一定是一个矩形的对角线。反之也成立。 因此问题成为:查找长度和中点都相同的线段有多少。 由于是动态插入、查找,一般用hash表方法最有效。,思考题3:找名字,找名字 给定一个全部由字符串组成的字典,字符串全部由大写字母构成。其中为每个字符串编写密码,编写的方式是对于 n 位字符串,给定一个 n 位数,大写字母与数字的对应方式按照电话键盘的方式:2: A,B,C 5: J,K,L 8:

11、 T,U,V3: D,E,F 6: M,N,O 9: W,X,Y4: G,H,I 7: P,R,S题目给出一个 1-12 位的数,找出在字典中出现且密码是这个数的所有字符串。字典中字符串的个数不超过 8000 。,分析,对于给定的编码,只需要一个回溯的过程,所有可能的原字符串都可以被列举出来,剩下的就是检查这个字符串是否在给定的字典中了。 所以这个问题需要的还是“某个元素是否在已知集合中?”由于给出的“姓名”都是字符串,因此我们可以利用字符的 ASCII 码。 那么,如何设计这个哈希函数呢?注意到题目给出的字典中,最多能有5000 个不同元素,而一个字符的 ASCII 码只能有26 种不同的取

12、值,因此至少需要用在3个位置上的字符(263 5000,但是 262 5000 ),于是我们就选取3个位置上的字符。由于给定的字符串的长度从 1-12 都有可能,为了容易实现,选取最开始的1个字符和最末尾的2个字符。让这3个字符组成27进制的3位数,则这个数的值就是这个字符串的编码。这样哈希函数就设计出来了!,思考题4:烦恼的设计师,给定两个正6边形的花坛,要求求出从第一个变化到第二个的最小操作次数以及操作方式。 一次操作是:选定不在边上的一盆花,将这盆花周围的6盆花按照顺时针或者逆时针的顺序依次移动一个单位。 一个花坛里摆放的不同种类的花不超过3种,对于任意两种花,数量多的花的盆数至少是数量

13、少的花的2倍。,输入: 输入文件共11行,15行描述花坛的初始状态,711行表示花盆应摆放的位置。中间以空行分隔。5行数字分别表示花坛的5个行,其中第1、5两行有3个整数,第2、4两行有4个整数,第3行有5个整数,表示每一行的花的类型,不同的数代表不同种类的花。 输出: 输出文件第一行包含一个整数T即最少的操作数,数据保证20步之内有解。以下T行输出操作序列,每行代表一次操作,包括3个整数Xi,Yi,Ki,(Xi,Yi)表示第i步转动第Xi行,第Yi盆花下的转盘,当Ki为0时表示向顺时针方向转动,Ki为1时表示向逆时针方向转动,如有多种方案,任意输出其中一种即可。,题意简述,本题要求将一个边长

14、为3的六边形阵(共19个元素)通过一定的规则变换,从初始状态转化为目标状态,并使变换的次数最少。具体规则如下:每次选定除边缘之外的7个元素之一,将其周围的6个元素沿顺时针方向或逆时针方向移动一个位置。输入初始状态和目标状态,输出最少变换次数以及一种是变换次数最少的变换方法。,分析,首先确定本题可以用广度优先搜索处理,然后来看问题的规模。 正6边形共有19个格子可以用来放花,而且根据最后一句限定条件 一个花坛里摆放的不同种类的花不超过3种。 对于任意两种花,数量多的花的盆数至少是数量少的花的2倍。 至多只能存在 C(2,19) * C(5,17) = 1058148 种状态,用宽搜完全可行。,用

15、HASH表判重,然而在广搜的时候,可以预料产生的重复节点是相当多的,需要迅速判重才能在限定时间内出解,因此想到了哈希表。 那么这个哈希函数如何设计呢?注意到19个格子组成6边形是有顺序的,而且每一个格子只有3种可能情况,那么用3进制19位数最大 320-1=3486784400 ,完全可以承受。 于是我们将每一个状态与一个整数对应起来,使用除余法就可以了。,思考题5:方程的解数,已知一个n元高次方程:,其中:,x1, x2 xn是未知数, k1,k2 kn是系数, p1,p2 pn是指数,且方程中的所有数均为整数。,假设未知数1 xiM, i=1,2,n,求这个方程的整数解的个数。,约束条件1n6;1M150;,方程的整数解的个数小于231,分析(1),题目要求出给定的方程解的个数,这个方程在最坏的情况下可以有6个未知数,而且次数由输入决定。这样就不能利用数学方法直接求出解的个数,而且注意到解的范围最多150个数,因此恐怕只能使用枚举法了。最简单的思路是穷举所有未知数的取值,这样时间复杂度是 O(M6) ,无法承受。 否缩小枚举的范围呢?,分析(2),我们再次注意到M 的范围,若想不超时,似乎算法的复杂度上限应该是 O(M3) 左右,这是因为 1503 10000000 。这就启示我们能否仅仅通过枚举3个未知数的值来找到答案呢? 如果这样,前一半式子的值 S 可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论