专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

匹配算法有哪些,常用的字符串匹配算法最全详解

来源:小易整编  作者:小易  发布时间:2023-02-08 09:19
摘要:匹配算法有哪些,常用的字符串匹配算法最全详解子字符串匹配子字符串匹配算法的定义:文本长度:N模式字符串长度:M有效位移:s解决字符串的匹配算法有非常多,目前常用的有以下几种:暴力查找KMP算法Boyer-Moore算法Rabin-Karp指...

匹配算法有哪些,常用的字符串匹配算法最全详解

匹配算法有哪些,常用的字符串匹配算法最全详解

匹配算法有哪些,常用的字符串匹配算法最全详解

根据"坏字符规则",此时搜索词应该后移 2 - (-1)= 3 位。问题是,此时有没有更好的移法?

比较前面一位,"MPLE"与"MPLE"匹配。我们把这种情况称为"好后缀"(good suffix),即所有尾部匹配的字符串。注意,"MPLE"、"PLE"、"LE"、"E"都是好后缀

"好后缀规则":后移位数 = 好后缀的位置 - 搜索词中的上一次出现位置

这个规则有三个注意点:

(1)"好后缀"的位置以最后一个字符为准。假定"ABCDEF"的"EF"是好后缀,则它的位置以"F"为准,即5(从0开始计算)。

(2)如果"好后缀"在搜索词中只出现一次,则它的上一次出现位置为 -1。比如,"EF"在"ABCDEF"之中只出现一次,则它的上一次出现位置为-1(即未出现)。

(3)如果"好后缀"有多个,则除了最长的那个"好后缀",其他"好后缀"的上一次出现位置必须在头部。比如,假定"BABCDAB"的"好后缀"是"DAB"、"AB"、"B",请问这时"好后缀"的上一次出现位置是什么?回答是,此时采用的好后缀是"B",它的上一次出现位置是头部,即第0位。这个规则也可以这样表达:如果最长的那个"好后缀"只出现一次,则可以把搜索词改写成如下形式进行位置计算"(DA)BABCDAB",即虚拟加入最前面的"DA"。

回到上文的这个例子。此时,所有的"好后缀"(MPLE、PLE、LE、E)之中,只有"E"在"EXAMPLE"还出现在头部,所以后移 6 - 0 = 6位。

可以看到,"坏字符规则"只能移3位,"好后缀规则"可以移6位。所以,Boyer-Moore算法的基本思想是,每次后移这两个规则之中的较大值。

Boyer–Moore 算法的精妙之处在于,其通过两种启示规则来计算后移位数,且其计算过程只与模式 P 有关,而与文本 T 无关。因此,在对模式 P 进行预处理时,可预先生成 "坏字符规则之向后位移表" 和 "好后缀规则之向后位移表",在具体匹配时仅需查表比较两者中最大的位移即可。

Rabin-Karp

首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配.

这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素.

基本思想

长度为M的字符串对应着一个R进制的M位数, 为了用一张大小为Q的散列表来保存这种类型的键, 需要一个能够将R进制的M位数转化为一个0到Q-1之间的int值散列函数, 这里可以用除留取余法.

举个例子, 需要在文本 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 查找模式 2 6 5 3 5, 这里R=10, 取Q=997, 则散列值为

2 6 5 3 6 % 997 = 613

然后计算文本中所有长度为5的子字符串并寻找匹配

3 1 4 1 5 % 997 = 5081 4 1 5 9 % 997 = 201......2 6 5 3 6 % 997 = 613 (匹配)

计算散列函数

在实际中,对于5位的数值, 只需要使用int就可以完成所有需要的计算, 但是当模式长度太大时, 我们使用Horner方法计算模式字符串的散列值

2 % 997 = 2

2 6 % 997 = (2*10 + 6) % 997 = 26

2 6 5 % 997 = (26*10 + 5) % 997 = 265

2 6 5 3 % 997 = (265*10 + 3) % 997 = 659

2 6 5 3 5 % 997 = (659*10 + 5) % 997 = 613

这里关键的一点就是在于不需要保存这些数的值, 只需保存它们除以Q之后的余数.

取余操作的一个基本性质是如果每次算术操作之后都将结果除以Q并取余, 这等价于在完成所有算术操作之后再将最后的结果除以Q并取余.

算法实现:

构造函数为模式字符串计算了散列值patHash并在变量中保存了R^(M-1) mod Q的值, hashSearch()计算了文本前M个字母的散列值并和模式字符串的散列值比较, 如果没有匹配, 文本指针继续下移一位, 计算新的散列值再次比较,知道成功或结束.

Java代码:

蒙特卡洛算法和拉斯维加斯算法区别:

匹配算法有哪些,常用的字符串匹配算法最全详解

总结

优点:

  • 暴力查找算法:实现简单且在一般情况下工作良好(Java的String类型的indexOf()方法就是采用暴力子字符串查找算法);

  • Knuth-Morris-Pratt算法能够保证线性级别的性能且不需要在正文中回退;

  • Boyer-Moore算法的性能一般情况下都是亚线性级别;

  • Rabin-Karp算法是线性级别;

缺点:

  • 暴力查找算法所需时间可能和NM成正比;

  • Knuth-Morris-Pratt算法和Boyer-Moore算法需要额外的内存空间;

  • Rabin-Karp算法内循环很长(若干次算术运算,其他算法都只需要比较字符);

匹配算法有哪些,常用的字符串匹配算法最全详解

匹配算法有哪些,常用的字符串匹配算法最全详解


本文地址:百科问答频道 https://www.neebe.cn/wenda/903057_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!

共2页 1 2 当前是最后一页

百科问答
小编:小易整编
相关文章相关阅读
  • 线性搜索算法是什么意思?

    线性搜索算法是什么意思?

    线性搜索算法是一种常见的搜索算法,也叫线性搜索或顺序搜索,它的基本思想是从序列的头(或尾)端开始,一次沿着序列的方向进行搜索,直到搜索到被搜索元素为止。线性搜索算法可以用来在一组元素中搜索某个特定的元素,它是一种最简单且最常用的搜索算法。...

  • 智能优化算法是什么意思?

    智能优化算法是什么意思?

    智能优化算法是一种利用复杂搜索和优化算法,从复杂环境中求解优化问题的一种计算方法。它能够有效地解决问题,其本质就是通过改进最优化问题的目标函数来改善求解的问题。智能优化是基于数学和统计的概念,它同时考虑到了复杂场景下函数的优化,以提高问题...

  • JS 字符串转数组

    JS 字符串转数组

    JS中,将一个字符串转置为数组,使用到的方法是split(),通过使用split()方法,可以轻松的将一个字符串转换为数组操作方法01新建一个HTML文档,用于承载JS02...

  • 签名算法是什么

    签名算法是什么

    签名算法是指数字签名的算法。数字签名就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。签名算法是指数字签名的算法。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段...

  • 国密算法是什么

    国密算法是什么

    国密即国家密码局认定的国产密码算法。商用密码是指能够实现商用密码算法的加密、解密和认证等功能的技术。商用密码技术是商用密码的核心,国家将商用密码技术列入国家秘密,任何单位和个人都有责任和义务保护商用密码技术的秘密。国密即国家密码局认定的国产...

  • 扫一扫自己脸型配发型的软件2022 好用的发型匹配软件推荐

    扫一扫自己脸型配发型的软件2022 好用的发型匹配软件推荐

    最近有很多用户们想知道有哪些发型匹配软件,那么扫一扫自己脸型配发型的软件2022有哪些呢,小编为大家带来好用的发型匹配软件推荐,帮助大家快速的找到好用的发型匹配软件,解决用户们发型匹配方面的问题,快来看看都有哪些好用的发型匹配软件吧!1、《...

  • 英雄联盟匹配机制是什么样的 盘点匹配机制上分技巧攻略

    英雄联盟匹配机制是什么样的 盘点匹配机制上分技巧攻略

    英联联盟采纳的是ELO值匹配机制,ELO值也就是说是游戏玩家嘴里的"隐蔽分"。那么本期小编就来讲下英雄联盟匹配机制是什么样的,盘点匹配机制上分技巧攻略。碰到总是输的情形,偶尔玩个娱乐模式都会呈现5连跪的情形,你怎么样尽力......

  • 适用于所有手环app有哪些 可以和手环匹配连接的软件排行

    适用于所有手环app有哪些 可以和手环匹配连接的软件排行

    人们常说生命在于运动,在平时只有适当的运动才可以拥有健康的体魄。只不过很多人难以长期坚持下去,只是三天打鱼两天晒网。如果自己没有持之以恒的心,可以佩戴一个运动手环,那么适用于所有手环app有哪些?利用运动手环可以监测自己每天的运动成果,并提...

  • 周排行
  • 月排行
  • 年排行

精彩推荐