算法合集之《hash在信息学竞赛中的一类应用》

算法合集之《hash在信息学竞赛中的一类应用》

ID:26652154

大小:172.67 KB

页数:11页

时间:2018-11-28

算法合集之《hash在信息学竞赛中的一类应用》_第1页
算法合集之《hash在信息学竞赛中的一类应用》_第2页
算法合集之《hash在信息学竞赛中的一类应用》_第3页
算法合集之《hash在信息学竞赛中的一类应用》_第4页
算法合集之《hash在信息学竞赛中的一类应用》_第5页
资源描述:

《算法合集之《hash在信息学竞赛中的一类应用》》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Hash在信息学竞赛中的一类应用【正文】Hash表作为一种高效的数据结构,有着广泛的应用。如果Hash函数设计合理,理想情况下每次查询的时间花费仅仅为O(h/r),即和Hash表容量与剩余容量的比值成正比。只要Hash表容量达到实际使用量的大约1.5倍以上,查询花费的时间基本就可以认为恒为O(1)。对于一个Hash表,一个好的Hash函数是尤其重要的,因为它能使Hash表保证效率。一个好的Hash函数最显而易见的特征是,能使不相同的东西经过Hash之后只有很小的几率相同。这样能避免过多冲突的产生。Hash表离不开Hash函数,但是反过来呢?有的时候,Hash函

2、数却是可以离开Hash表的。一个常见的例子就是著名的MD5算法,它是一个Hash函数,但是它的用途往往是对信息进行加密,以验证信息的正确性。换句话说,我们事实上是通过直接比较MD5算出的结果是否相同以推断原文内容是否一致。除了MD5,常用的CRC32校验码和SHA-1算法也是基于类似的想法而产生的。那么,信息学竞赛中,这样的算法有没有用武之地呢?本文要讨论的,就是这一类以判重或判等价为目标的Hash函数。让我们来看看例题1。例题1多维匹配题目大意在一个串中求另一个串第一次出现的位置,很简单,KMP即可。扩展到二维情况,就是求在一个矩阵中求另一个矩阵第一次出现的

3、位置。而如果扩展到k维的情况,又该怎么做呢?待匹配数组X各维的尺寸为N1,N2,…,Nk,模式数组Y各维的尺寸为M1,M2,…,Mk。记N=N1N2…Nk,M=M1M2…Mk。保证k≤10,Ni≥Mi,而N和M都不超过500000。算法分析本题常见的算法是多维情况的KMP,先算1维时的匹配情况,然后处理2维,3维……直到N维时的情况。时间复杂度为O(k*(N+M))。但是它难以理解和记忆,也不容易在比赛中的短短几个小时完成和写对。朴素的解法相对易于实现,但是使朴素算法很容易想到,而且针对数据又很容易制作,因此只有在完全没有思路的时候才值得一试。有没有第三种选择

4、呢?答案是肯定的。朴素的解法相当于枚举了每个起点(起点数量显然不会超过N)并加以判断,然而判断两个子数组是否相同的时间复杂度高达O(M),这就是导致朴素算法在遇到针对数据的情况下很慢的原因。能不能在比较两个子数组之前先快速地排除一些明显不可能的情况呢?由于很容易构造出仅有一个字符不同的数据,不管采用什么顺序比较都会消耗大量的时间。Hash函数在这里派上了用场。我们可以对每个尺寸与模式数组一样的子数组计算一个Hash值。显然,只有当某个子数组的Hash值与模式数组的Hash值一样,它们才值得比较。多维的KMP要从1维的情况开始考虑,并推广至高维。那么这种计算Ha

5、sh函数的匹配算法我们也可以先考虑一维的情况——就是Rabin-Karp算法。对于一个字符串S,可以使用这个函数求出其Hash值:那么,模式串Y的Hash值就可以轻松地求出。记待匹配串X从第i个字符开始的长度为M的子串为Si,则不难发现f(Si+1)和f(Si)的关系:换个角度,如果不考虑modq,这个函数就是把字符串看作一个p进制数求出的值,这样,Xi+1就是Xi“左移”一位,然后去掉最前面一位,再加上右面新进来的一位得到的。因此上面的递推公式也是显然的。有了这个递推公式,不难在线性时间内求出X的所有长度为M的子串的Hash值。现在把问题扩展到高维的情况。不

6、难发现要计算的Hash值的个数仍然不超过N个,可见,只要有合适的递推方法,仍然可以在线性时间内求出所有子矩阵的Hash值。事实上,一个M1行,M2列的子矩阵可以被看作是M2个“竖条”组成的一个串。我们可以先把每个长度为M1的“竖条”计算出一个Hash值,然后再计算二维情况的Hash值。需要注意的一点是,在计算一维的Hash值(“竖条”的Hash值)和计算二维的Hash值时使用的b值不能一样,不然不难想到下面反例:abaaaaba它们并不相同,但是Hash的结果肯定一样。这就违背了使用Hash的初衷。因此,在第一维的计算和第二维的计算中要使用不同的p值。二维情况

7、时,求出所有长度为M1的“竖条”所需要花费的时间是O(N)的,然后把这些竖条的Hash值看作“字母”计算横向的Hash值(即各个子矩阵的Hash值),所花费的时间也是O(N)的。总时间复杂度仍然是O(N)的。二维情况的Hash函数为(len1(S)和len2(S)分别表示S在两个维度上的大小):类似地,记待匹配矩阵X从第i1行,第i2列为左上角的M1行,M2列的子矩阵为,我们有递推式:式中和都是一维情况下的Hash值,即预先计算出的“竖条”的Hash值。扩展到k维情况,则不难想到,先算出所有尺寸为M1×M2×…×Mk-1的子数组的Hash值,再使用类似上面的办

8、法把这些尺寸为M1×M2×…×Mk-1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。