数据结构串a教学.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2020/4/16 数据结构 31 根据模式串 T 的规律: ‘ T 1 …T k-1 '=‘T j-(k-1) …T j-1 ' 由当前失配位置 j ( 已知 ) ,可以 归纳 出计算新起点 k 的表达式。 next[ j ] = 0 当 j = 1 时 // 不比较 max { k | 1<k<j 且‘ T 1 …T k-1 '=‘T j-(k-1) …T j -1 ' } 1 其他情况 讨论: ( 1 ) next[ j ] 的物理意义是什么? ( 2 ) next[ j ] 具体怎么求? — 即 KMP 算法的实现 令 k = next[ j ] ( k 与 j 显然具有函数关系),则 取 T 首与 Tj 处最大的相同子串 新起点 k 怎么求? 2020/4/16 数据结构 32 ( 1 ) next[ j ] 有何物理意义? next[j] 函数表征着模式 T 中最大相同前缀子串和后缀子串 (真子串)的长度。 可见,模式中 相似部分越多,则 next[j] 函数越大 ,它既 表示模式 T 字符之间的相关度越高,也表示 j 位置以前与主串 部 分匹配 的字符数越多。 即: next[j] 越大,模式串向右滑动得越远, 与主串进行 比较的次数越少,时间复杂度就越低(时间效率)。 next[ j ] = max { k | 1<k<j 且‘ T 1 …T k-1 '=‘T j-(k-1) …T j - 1 ' } 模式串从第 1 位往右 直到 K-1 位 模式串从 j 的前一位往 左经过 K-1 位 想一想:如果主串和模式均为二 进制码流,用 KMP 算法效果如何? T= ‘ a b a a b c a c ' 再想一想:如果主串是外存中一个 大文件,用 KMP 算法效果又如何? ( 2 ) next[ j ] 具体怎么求? — 即 KMP 算法的实现 2020/4/16 数据结构 33 计算 Next[j] 的方法: ? 当 j=1 时, Next[j]=0 ; //Next[j]=0 表示根本不进行字符比较 ? 当 j>1 时, Next[j] 的值为:模式串的位置 从 1 到 j-1 构成的串中所出现的 首尾相同的子串 的最大长度 加 1 。 无首尾相同的子串时 Next[j] 的值为 1 。 // Next[j]=1 表示从模式串头部开始进行字符比较 ( 2 ) next[ j ] 怎么计算? 怎样计算模式 T 所有可能的失配点 j 所对应的 next[j] ? 2020/4/16 数据结构 34 从两头往中间比较 模 式 串 T : a b a a b c a c 可能失配位 j : 1 2 3 4 5 6 7 8 新匹配位 k= next[ j ] : next[ j ] = 0 当 j = 1 时 max { k |1<k<j 且‘ T 1 …T k-1 '=‘T j-(k-1) …T j-1 ' } 1 其他情况 0 1 1 2 2 3 1 2 讨论: j=1 时 , next[ j ]≡ 0 ; // 属于“ j=1” 情况 ; j=2 时 , next[ j ]≡ 1 ; // 找不到 1<k<j 的 k ,属于“其他情况”; 刚才已归纳: j=3 时 , k={2} ,只需查看‘ T 1 '=‘T 2 ' 成立否, No 则属于其他情况 j=4 时 , k={2 , 3} ,要查看‘ T 1 ' = ‘ T 3 ' 及‘ T 1 T 2 ' = ‘ T 2 T 3 ' 是否成 立 j=5 时 , k={2 , 3 , 4} ,要查看‘ T 1 '=‘T 4 ' ,‘ T 1 T 2 '=‘T 3 T 4 ' 和 ‘ T 1 T 2 T 3 '=‘T 2 T 3 T 4 ' 以此类推,可得后续 next[j] 值。 可用演示程序验证 next[j] 与 s 无关, 可以预先计算 例: 2020/4/16 数据结构 35 下一个要讨论的问题是:如何 用递推方式 来求出最大 相同子串的长度呢?换言之,如何让电脑替我们求出 最大相同子串呢?这个问题一旦解决,整个 KMP 算 法就可以掌握得很透彻了。 void get_next (SString T, int &next[ ] ){ // // 求模式串 T 的 next 函数值并存入数组 next[ ] 。 i=1; next[1]=0; j=0; while(i<T[0] ){ if(j= = 0||T[i]= =T[j]){++i; ++j; next[i]=j ;} else j= next[j]; } } // get_next 递推法编程

您可能关注的文档

文档评论(0)

magui + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档