当前位置: 首页 > news >正文

射阳建设局网站查询网域名查询

射阳建设局网站,查询网域名查询,长沙娱乐网站开发,wordpress 文章页 下载地址KMP算法#xff1a;求字符串匹配#xff08;也叫模式匹配#xff09;的算法#xff0c;即给定一个字符串#xff0c;求其某一子串在其中出现的位置。 普通模式匹配 例如#xff1a;给定字符串为abcabaaabaabcac#xff0c;求其子串abaabcac在其中出现的位置。 结果为…KMP算法求字符串匹配也叫模式匹配的算法即给定一个字符串求其某一子串在其中出现的位置。 普通模式匹配 例如给定字符串为abcabaaabaabcac求其子串abaabcac在其中出现的位置。 结果为7 对于这种问题没有经验的编程者通常会采用逐个匹配的方法来得出结果。这就是最简单一种算法思想。 1. 逐个进行比较如果相同就继续比较下一个但是我们可以看到下图中c与a不相同这就是所谓的“失配”。 2. 当发生失配我们会将子字符串逐个后移直到新的匹配建立再逐个比较 3. 4. 5. 6. 7. 根据上面的方法我们可以看到第二步有两个图这是为什么呢这是因为当出现失配时候字符串每次后移一个的方法不能够立刻建立匹配还需要继续后移才能建立。也就是说这种情况下后移两个才能建立匹配。 当然这个例子比较小只出现了两次这种情况但是如果是较大的数据这种冗余操作是十分低效的。这也就是KMP算法优化的地方。 KMP算法--next[] KMP算法会创建一个next[]数组用来保存一个字符失配后到底跳转到第几个的位置才能更快速的建立匹配。这里用了跳转这个词因为并不是向后移动next[i]位而应该是直接跳转到相应的位置使失配位与第next[i]位相对。这个数组是KMP算法的核心。 下面以字符串abaabcac为例求解next数组模式匹配的数组下标从1开始这个算法推荐这么做很多事情没有那么多理由 next数组按照最长相等前后缀长度求解 next[1]字符串“a”前缀{}后缀{}没有相等前后缀next记为0。要注意前后缀均不包括整个串。 next[2]字符串“ab”前缀{a}后缀{b}没有相等前后缀next记为0。 next[3]字符串“aba”前缀{a,ab}后缀{a,ba}相等前后缀{a}长度为1next记为1。 next[4]字符串“abaa”前缀{a,ab,aba}后缀{a,aa,baa}相等前后缀{a}长度为1next记为1。 next[5]字符串“abaab”前缀{a,ab,aba,abaa}后缀{b,ab,aab,baab}相等前后缀{ab}长度为2next记为2。 next[6]字符串“abaabc”前缀{a,ab,aba,abaa,abaab}后缀{c,bc,abc,aabc,baabc}相等前后缀{}next记为0。 next[7]字符串“abaabca”前缀{a,ab,aba,abaa,abaab,abaabc}后缀{a,ca,bca,abca,aabca,baabca}相等前后缀{a}长度为1next记为1。 next[8]字符串“abaabcac”前缀{a,ab,aba,abaa,abaab,abaabc,abaabca}后缀{c,ac,cac,bcac,abcac,aabcac,baabcac}相等前后缀{}next记为0。 i12345678str.charAt(i)abaabcacnext[i]00112010 由于使用next[]时每次失配都需要找它前面一个元素的next[]进行移动为了方便我们将next数组右移一位。最左侧填充-1舍弃最右侧的元素。 i12345678str.charAt(i)abaabcacnext[i]-10011201 为了简化计算我们对next[]整体1这里得到的是我们通常使用的next[]。 i12345678str.charAt(i)abaabcacnext[i]01122312求解next数组代码 private static int[] get_Next(String str){ int[] next new int[str.length()1]; int j next[2];// 这里next[1]和next[2]直接赋值next[1] 0;next[2] 1;for(int i 2; i str.length(); i) { while(j 0 str.charAt(i-1) ! str.charAt(j)) {j next[j]; }if(str.charAt(i-1) str.charAt(j)) {j;}next[i] j;} return next; } KMP算法改进--nextval[] 比较当前next[i]的值与 1.前两位必为01 计算nextval[3]时我们可以知道第三位字符位‘a’next[3]1故查看第1位的字符为‘a’字符相同所以nextval[3]next[1]0 计算nextval[4]时我们可以知道第四位字符位‘a’next[4]2故查看第2位的字符为‘b’字符不同所以nextval[4]next[4]2 计算nextval[5]时我们可以知道第五位字符位‘b’next[5]2故查看第2位的字符为‘b’字符相同我们知道next[2]1故继续查看第1位的字符为‘a’字符不同所以nextval[5]next[2]1 计算nextval[6]时我们可以知道第六位字符位‘c’next[6]3故查看第3位的字符为‘a’字符不同所以nextval[6]next[6]3 计算nextval[7]时我们可以知道第七位字符位‘a’next[7]1故查看第1位的字符为‘a’字符相同所以nextval[7]next[1]0 计算nextval[8]时我们可以知道第八位字符位‘c’next[8]2故查看第2位的字符为‘b’字符不同所以nextval[7]next[7]2 i12345678str.charAt(i)abaabcacnextval[i]01021302 根据next数组我们再来做一遍这个题目给定字符串为abcabaaabaabcac求其子串abaabcac在其中出现的位置。 1.创建匹配第4个字符发生失配 2.使失配位与子串的第next[4]2位相对但是这是第二个字符又失配了 3.使失配位与子串的第next[2]1位相对此时第一个字符就失配 4.使失配位与子串的第next[1]0位相对注意我们的next数组是从1开始算的所以相当于整体后移一个单位下图的失配位实际是c 5.使失配位与子串的第next[4]2位相对 6.使失配位与子串的第next[4]2位相对 7.匹配成功 完整代码如下 public class Main { public static void main(String[] args) { String str abaabcac; String orig aabaabcac; int[] next get_Next(str); for (int i 1; i next.length; i) {System.out.print(next[i] );}System.out.println();search(orig, str, next); } //next[i]表示的是str的部分匹配表,这个表表示的是str前缀与后缀的最长公共字符串的长度private static int[] get_Next(String str){ int[] next new int[str.length()1]; int j next[2];// 这里next[1]和next[2]直接赋值next[1] 0;next[2] 1;// 第2位之后的next,为什么从2开始不是已经赋值了吗这在于str.charAt(0)为字符串的第一个字母for(int i 2; i str.length(); i) { while(j 0 str.charAt(i-1) ! str.charAt(j)) {j next[j]; }if(str.charAt(i-1) str.charAt(j)) {j;}next[i] j;} return next; } //orig为主串而find为模式串查找匹配位置以及匹配长度 private static void search(String orig, String find, int[]next){ int j next[0]; for(int i 0;i orig.length(); i){ while(j 0 orig.charAt(i) ! find.charAt(j)) j next[j]; if(orig.charAt(i) find.charAt(j)){ j; }if(j find.length()){ System.out.println(find at position (i - j1)); System.out.println(orig.subSequence(i - j 1, i 1)); j next[j];}}} } 当然还有一种BM算法效率比KMP算法还好。有兴趣的读者可以参考时空权衡在模式匹配算法中的应用JAVA--Horspool算法简化版BM算法 nextval数组实际的数值是明显要小于next数组的nextval数组由于考虑到了移动到的位置的数与当前位置数的关系可以减少移动的距离。
http://www.pierceye.com/news/879537/

相关文章:

  • ac域名网站邯郸中国建设银行网站
  • 广州seo网站开发微信营销的优势
  • 宝塔可以做二级域名网站么有哪些好的做兼职网站
  • 网站建设公司落寞特殊符号网名生成器
  • 设计分享网站在闲鱼可以做网站吗
  • 安全等级保护每个网站必须做吗实惠的网站建设公司
  • vue可以做pc端网站山东专业企业网站建设
  • 推广网站软文高中网站制作
  • 做h的动漫在线观看网站安阳市有几个区几个县
  • 帝国cms地方门户网站模板怀集县住房和城乡规划建设网站
  • 河北住房建设厅网站首页怎么自己建设网站
  • 政务网站建设及安全下载app赚钱的平台
  • 如何制作一个论坛网站都江堰建设局网站
  • 网站建设seo优化浙江广17网站一起做网店
  • WordPress子站站群优化教程网站推广排名
  • 毕设做购物网站容易吗网上商城是什么意思
  • 1688阿里巴巴官方网站杭州网站建设seo
  • 建设网站选什么地方的主机网站上漂亮的甘特图是怎么做的
  • 用什么软件来建网站立创电子元器件商城官网
  • 做视频网站成本如何定制微信小程序
  • 南宁市有哪些做网站的外包企业青州网站建设公司
  • 网站排名点击中国建筑是国企还是央企
  • 广告联盟的网站怎么做太仓苏州网站建设
  • 杭州 seo网站建设 网络服务包头企业网站
  • 网站导航字体企业网站建设及维护
  • 买东西网站产品设计网张
  • 国外有哪些设计网站嵌入式软件开发工具有哪些
  • 做网站推广的销售电话开场白wordpress小工具插件
  • 简单网站建设公司flashfxp上传wordpress
  • 网站建设策划包括哪些内容展馆设计图