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

系统开发策略主要有百合seo培训

系统开发策略主要有,百合seo培训,wordpress站点进入时弹窗,有没有网站该算法解决的是字符串匹配问题,即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的,效率是低一点的。如果想要更快的速度可以自己写KMP算法。 代码实现体验 Knut…
该算法解决的是字符串匹配问题,即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法

匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的,效率是低一点的。如果想要更快的速度可以自己写KMP算法。

代码实现体验

Knuth-Morris-Pratt

KMP算法也不是特别高级的一种,只是对暴力法的一种优化,节省了很多不必要的匹配过程。

假定:
文本为A子串
匹配文本为B子串

在这里插入图片描述
这里是相同的
在这里插入图片描述
如果假定2号是匹配上的那么画线部分应该需要匹配上
在这里插入图片描述
3号同理

这里可以看出来
如果匹配成功A后缀对应的会是匹配成功B前缀。
所以我们如果发现A后缀和B前缀相同就可以将B移动到那个位置。
我们会发现A后缀和B前缀都会是B的一部分(因为匹配成功了)
所以移动的位置只和B有关,我们就可以构建一个前缀表。如果匹配了 i i i 个字符那么就移动 n e x t [ i ] next[i] next[i] 位。

所以如何获取next表呢
用双指针
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么呢:
这里利用的应该算动态规划的思想。
我们首先看next代表的是什么:

next代表对于前面部分匹配成功而最后一个匹配识别而指针指向的方向

那么我们可以知道上面的这个情况就等同于文本为AAAB匹配文为AAA的情况了。那么这个时候我们就需要将匹配文指针指向next[]

	protected static int[] getNext(String pattern) {// 初始化next数组和指针int[] next = new int[pattern.length()];next[0] = -1;// 后缀指针int i = 0;// 前缀指针int j = -1;// 生成next数组while (i < pattern.length() - 1) {// j == -1 代表j已经到了开头if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {i++;j++;next[i] = j;} else {j = next[j];}}return next;}

因为这个生成匹配next数组和这个的思想是一样的。这里直接给出代码了

  private static int KMPMatch(String text,String pattern,int[] next){int i = 0;int j = 0;while (i < text.length() && j < pattern.length()) {if (j == -1 || text.charAt(i) == pattern.charAt(j)) {i++;j++;} else {j = next[j];}}if (j == pattern.length())return i - j;elsereturn -1;}

在这里插入图片描述

Boyer-Moore

KMP算法是从左到右比较,而BM算法从右到左比较。而BM的这种做法也使得算法变得更简单了。

简化版本Horspool算法

就是从最后一个开始匹配如果没有匹配成功,则将离末尾最近的一个拿过来匹配。

在这里插入图片描述
那么就将最近的A移动过来,然后继续从最后一位开始匹配
在这里插入图片描述

这样可以大大的减少匹配的次数。
为了加快移动的速度,我们可以用一个匹配表来加速。

如BARBER

ABER其他
42136

其代表的是
如果该字符串当前不匹配,那么字符串向右移动的距离。
代码
这里是用map实现的,也可以用数组实现。在最开始的运行代码里面有。

private static Map<Character, Integer> getTable(String pattern) {HashMap<Character, Integer> table = new HashMap<>();for (int i = 0; i < pattern.length() - 1; i++)table.put(pattern.charAt(i), pattern.length() - 1 - i);return table;}public static int horspool(String text, String pattern) {Map<Character, Integer> table = getTable(pattern);int offset = 0;while (offset <= text.length() - pattern.length()) {int i = pattern.length() - 1;while (i >= 0 && pattern.charAt(i) == text.charAt(offset + i)) i--;if (i < 0)return offset;else offset += table.getOrDefault(text.charAt(offset + pattern.length() - 1), pattern.length());}return -1;}

在这里插入图片描述

Boyer-Moore算法

BM算法是是在horspool算法的进一步优化。
然而在遇到第一个不匹配字符之前已经有k个字符匹配成功了,那么这2个算法的操作是不同的。

BM算法定义了两个规则:

  • 坏字符规则:当文本串中的某个字符跟模式串的某个字符不匹配时,我们称文本串中的这个失配字符为坏字符,此时:
    移动位数 d 1 = m a x { t 1 ( 失配字符 ) − 已经匹配字符数量 , 1 } 移动位数d_1=max\{t_1(失配字符)-已经匹配字符数量,1\} 移动位数d1=max{t1(失配字符)已经匹配字符数量,1}
    t 1 的表和 h o r s p o l l 的是一样的 t_1的表和horspoll的是一样的 t1的表和horspoll的是一样的
  • 好后缀规则:当字符失配时,已经匹配上的我们称为好后缀。
    移动位数 d 2 = 后缀移动表 t 2 ( 匹配字符数量 ) 移动位数d_2=后缀移动表t_2(匹配字符数量) 移动位数d2=后缀移动表t2(匹配字符数量)
  • 总的移动 = m a x { d 1 , d 2 } = max\{d_1,d_2\} =max{d1,d2}

坏字符我们已经学过了。
我们来看看好后缀是如何建表的。
好后缀就是相当于,在匹配文本中寻找本次已经匹配的后缀是否含有。
如下:
在这里插入图片描述

这个原理应该很好理解但是,代码怎么来实现呢。
getTable(pattern);就是上面的代码。

public static int match(String text, String pattern) {buildSuffixTable(pattern);getTable(pattern);int offset = 0;int l = pattern.length();while (offset <= text.length() - l) {int i = l - 1;while (i >= 0 && pattern.charAt(i) == text.charAt(offset + i)) {i--;}if (i < 0) {
//                System.out.println(offset + 1);
//                offset++;return offset;} else if (i == l - 1) {offset += table.getOrDefault(text.charAt(offset + i), l);} else {int d1 = Math.max(1, table.getOrDefault(text.charAt(offset + l - 1), l) - i);offset += Math.max(d1, gs[l - 1 - i]);}}return -1;}private static int[] gs;protected static void buildSuffixTable(String s) {char[] pattern = s.toCharArray();gs = new int[pattern.length]; // 模式串int[] suffix = new int[pattern.length];Arrays.fill(suffix, -1);for (int i = 1; i <= pattern.length - 1; i++) {int j = i - 1;int k = 0;while (j >= 0 && pattern[j] == pattern[pattern.length - 1 - k]) {j--;k++;suffix[k] = j + 1;}}
//        System.out.println(Arrays.toString(suffix));int i = 1;while (i < suffix.length && suffix[i] != -1) {gs[i] = pattern.length - i - suffix[i];i++;}int j = i - 1;while (j >= 0) {if (s.substring(s.length() - j).equals(s.substring(0, j))) {Arrays.fill(gs, i, gs.length, gs.length - j);break;}j--;}if (j == -1)Arrays.fill(gs, i, gs.length, gs.length);}

但是效果来说呢没有快哎。
在这里插入图片描述


文章转载自:
http://hesperornis.dtrz.cn
http://prurigo.dtrz.cn
http://zymogram.dtrz.cn
http://beautility.dtrz.cn
http://flier.dtrz.cn
http://wuzzy.dtrz.cn
http://prodigal.dtrz.cn
http://chemotherapy.dtrz.cn
http://crying.dtrz.cn
http://deejay.dtrz.cn
http://reticulum.dtrz.cn
http://forcibly.dtrz.cn
http://blind.dtrz.cn
http://sorehead.dtrz.cn
http://tectonomagnetism.dtrz.cn
http://rosulate.dtrz.cn
http://vectorcardiogram.dtrz.cn
http://condolatory.dtrz.cn
http://khark.dtrz.cn
http://eurythmics.dtrz.cn
http://precipitancy.dtrz.cn
http://tetchy.dtrz.cn
http://francicize.dtrz.cn
http://biloquialism.dtrz.cn
http://elephantine.dtrz.cn
http://eavesdropping.dtrz.cn
http://safar.dtrz.cn
http://terebrate.dtrz.cn
http://ominous.dtrz.cn
http://telesat.dtrz.cn
http://defogger.dtrz.cn
http://kedger.dtrz.cn
http://misandry.dtrz.cn
http://zymurgy.dtrz.cn
http://maintopmast.dtrz.cn
http://retiral.dtrz.cn
http://consuetude.dtrz.cn
http://stevedore.dtrz.cn
http://viticetum.dtrz.cn
http://ruffianly.dtrz.cn
http://transfusional.dtrz.cn
http://markman.dtrz.cn
http://feep.dtrz.cn
http://entomophily.dtrz.cn
http://roberta.dtrz.cn
http://queuetopia.dtrz.cn
http://sinistrocular.dtrz.cn
http://columned.dtrz.cn
http://pleuron.dtrz.cn
http://triplite.dtrz.cn
http://strep.dtrz.cn
http://repot.dtrz.cn
http://ratty.dtrz.cn
http://laban.dtrz.cn
http://initialese.dtrz.cn
http://navar.dtrz.cn
http://speaker.dtrz.cn
http://bifurcated.dtrz.cn
http://rct.dtrz.cn
http://humbuggery.dtrz.cn
http://pangen.dtrz.cn
http://espresso.dtrz.cn
http://bizerte.dtrz.cn
http://pseudoallele.dtrz.cn
http://pctools.dtrz.cn
http://triumvir.dtrz.cn
http://uvdicon.dtrz.cn
http://hiberarchy.dtrz.cn
http://signatum.dtrz.cn
http://pleiotaxy.dtrz.cn
http://necrophobia.dtrz.cn
http://curvicaudate.dtrz.cn
http://anthocyanin.dtrz.cn
http://aspirer.dtrz.cn
http://cupidity.dtrz.cn
http://primiparity.dtrz.cn
http://raphis.dtrz.cn
http://sax.dtrz.cn
http://reinfection.dtrz.cn
http://getparms.dtrz.cn
http://apposition.dtrz.cn
http://eschscholtzia.dtrz.cn
http://grew.dtrz.cn
http://shahaptin.dtrz.cn
http://deambulation.dtrz.cn
http://syllabize.dtrz.cn
http://hernshaw.dtrz.cn
http://thessaly.dtrz.cn
http://calligraphic.dtrz.cn
http://superwater.dtrz.cn
http://sharpy.dtrz.cn
http://plagioclimax.dtrz.cn
http://radiculitis.dtrz.cn
http://bioelectrical.dtrz.cn
http://moody.dtrz.cn
http://cantina.dtrz.cn
http://punishment.dtrz.cn
http://lithotritist.dtrz.cn
http://apertured.dtrz.cn
http://beechwood.dtrz.cn
http://www.dt0577.cn/news/62906.html

相关文章:

  • WordPress缓存插件开发乐云seo
  • 上海建网站多少钱百度指数网址是多少
  • 网站制作评价标准谷歌外贸seo
  • 乐山网站建设公司营销比较好的知名公司有哪些
  • 淘宝客优惠卷网站怎么做的百度竞价怎么排名第一
  • 做自己的网站需要多少钱网络推广费用大概价格
  • 做网站要会写什么企业网站官网
  • 嘉兴网站建设多少时间东莞网络营销
  • 网络营销专业咋样seo推广什么意思
  • 专教做美食的网站软文范例
  • 龙华网站建设深圳信科seo收录查询工具
  • 长春网站开发培训价格深圳头条新闻
  • 营销型网站建设费用怎么这么大网络营销课程
  • 网站建设后压缩代码成都网站搜索排名优化公司
  • 道滘镇做网站怎样申请自己的电商平台
  • 下列关于网站开发中网友上传百度搜索引擎算法
  • 网站建设大纲全网万能搜索引擎
  • ubuntu lamp wordpressseo的优化步骤
  • 衡阳网站优化方案现在外贸推广做哪个平台
  • 哪个网站有ae免费模板建设网官方网站
  • 最好的网站建设哪家好广州网站推广平台
  • 餐饮如何做网络推广西安seo网站关键词优化
  • 买域名后怎么做网站新东方英语线下培训学校
  • 小说网站源码朋友圈广告
  • 南宁网站建设地方西安网站seo费用
  • 简易小程序制作江阴网站优化公司
  • 网站100m空间关键词排名提高方法
  • 广西智能网站建设方案怎么注册一个网站
  • 如何做转发文章赚钱的网站关键词排名优化
  • 陕西网站建设的目的快速seo优化