哈希的应用优秀课件.ppt

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈希的应用 基本概念 很简单,哈希就是标记数组。我们把需要保存的状态(例如一列数、一个字符串等)用一个数代替,再存到一个数组中,这个数组就称为哈希数组。 为此,我们须要设计一个将状态对应到数的函数,称为哈希函数。 哈希函数 设计方法有很多,例如对于字符串S: hash(s)=((s[0]*256+s[1])*256+s2)*256+s[3]…… 或 hash(s)=s[0]*s[1]*s[2]*… 不过,这样哈希值可能会变得很大,以致于无法存到一个数组中。 所以在此基础上我们还要把哈希值模一个大质数,但这样有可能出现哈希冲突。 解决冲突 方法一般有二: 闭散列:当出现冲突时,一直往后寻找没有被占有的哈希值,找到后再插入; 开散列:开一个二维哈希数组hash,设当前要插入的哈希值为h,若hash[h][0]未被占则插入hash[h][0],否则查询hash[h][1]是否被占,未被占则插入hash[h][1]…… 应用:RK算法 这是一个基于哈希的字符串匹配算法。效率略低于kmp。 具体方法曾经讲过,这里再提一下: 设母串为a,子串为b,子串长度为lenb,则我们可以求出a[0]~a[lenb-1],a[1]~a[lenb]……这些字符串的哈希,再与b的哈希值比较,若相等则“极有可能”匹配。此时再一个一个比对就可以确认是否的确匹配。 RK算法 现在问题是如何很快算出a[i]~a[i+lenb-1]的哈希。 定义哈希函数hash(s)=((s[0]*256+s[1])*256+s2)*256+s[3]…… 则已知a[i-1]~a[i+lenb-2]的哈希值则可以很快推出a[i]~a[i+lenb-1]的哈希值。 应用:小藩的LCS(最长公共子串)问题。 LCP问题 给你一个字符串S及很多询问q(i,j),问s[i]~s[len-1]与s[j]~s[len-1]的最长公共前缀长度是多少。要求O(nlogn)的时间复杂度。 例:S=“bcbaabcbaabbac” q(1,6)=5 (即“cbaab”) 方法很多,如后缀数组、后缀树等等。 不过这些方法特点明显:常数大、代码繁重。 LCP哈希算法 定义f[i][j]为s[i]~s[i+2j-1]的哈希值。在计算f[i][j]时,可以从f[i][j-1]与f[i+2j-1-1][j-1]的值(也就是这个子串的左半部分与右半部分的哈希值推出。) 例如,我们定义哈希函数为把所有字符乘起来,则f[i][j]=f[i][j-1]* f[i+2j-1-1][j-1]再模一个大质数,其余函数自己推就可以了。 LCP哈希算法 既然是哈希,那么两个哈希值相等则两个字符串很可能相等。实在对RP不放心可以多用几个哈希函数,再逐一比较。 当询问q(i,j)时,(设i=j) 先令k=log2(len-j+1),比较f[i][k]与f[j][k]。 若f[i][k]==f[j][k],说明s[i]~s[i+2k-1]与s[j]~s[j+2k-1]相等,那么i=i+2k ,j=j+2k ,k--,答案累加k。 否则说明k过大,则k--。 由于运用了倍增思想,时间复杂度O(nlogn)。

文档评论(0)

it + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳春市夕秋图文设计有限公司
IP属地广东
统一社会信用代码/组织机构代码
91441781MA55YY8A1L

1亿VIP精品文档

相关文档