专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

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

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

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

子字符串匹配

子字符串匹配算法的定义:

  • 文本长度:N

  • 模式字符串长度:M

  • 有效位移:s

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

解决字符串的匹配算法有非常多,目前常用的有以下几种:

  • 暴力查找

  • KMP 算法

  • Boyer-Moore算法

  • Rabin-Karp指纹字符串查找

字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和。

常用算法

暴力查找

朴素的字符串匹配算法又称为暴力匹配算法(Brute Force Algorithm),它的主要特点是:

  • 没有预处理阶段;

  • 滑动窗口总是后移 1 位;

  • 对模式中的字符的比较顺序不限定,可以从前到后,也可以从后到前;

  • 匹配阶段需要 O((n - m + 1)m) 的时间复杂度;

  • 需要 2n 次的字符比较;

KMP 算法

详细过程:

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

从左到右匹配,直到匹配到第一个字符相等,如下图所示,然后继续匹配后面的字符。

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

到了D,发现不对,这是如果暴力法,则直接将模式后移一位,重新匹配。KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。

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

在查找的一开始根据模式字符串,生成一张《部分匹配表》(Partial Match Table)

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

移动位数 = 已匹配的字符数 - 对应的部分匹配值

所以移动为数 = 6 - 2 =4

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

在这里插入图片描述

这个《部分匹配表》如何生成?

"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例,

- "A"的前缀和后缀都为空集,共有元素的长度为0;- "AB"的前缀为[A],后缀为[B],共有元素的长度为0;- "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;- "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;- "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;- "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;- "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。

Boyer-Moore

几种常见的字符串匹配算法的性能比较:

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

KMP算法并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。

详细过程:

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

首先,"字符串"与"搜索词"头部对齐,从尾部开始比较。我们看到,"S"与"E"不匹配。这时,"S"就被称为"坏字符"(bad character),即不匹配的字符。我们还发现,"S"不包含在搜索词"EXAMPLE"之中,这意味着可以把搜索词直接移到"S"的后一位。

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

依然从尾部开始比较,发现"P"与"E"不匹配,所以"P"是"坏字符"。但是,"P"包含在搜索词"EXAMPLE"之中。所以,将搜索词后移两位,两个"P"对齐。

"坏字符规则":后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置(如果"坏字符"不包含在搜索词之中,则上一次出现位置为 -1)

上图中,比较的是P和E,出现在第6位(0开始),然后P上一次位置是4,所以6-4=2

接着继续,一直比较到M:


本文地址:IT问答频道 https://www.eeeoo.cn/itwenda/903057.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!


IT问答
小编:小嗨整编
相关文章相关阅读
  • php怎么实现对字符串的排序

    php怎么实现对字符串的排序

    实现步骤:1、利用str_split()函数将字符串转为字符数组,语法“str_split(字符串)”;2、使用asort()或arsort()函数来对字符数组进行升序排序或降序排序,语法“asort(字符数组)”或“arsort(字符数组...

  • 如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量在PHP中,字符串变量是一种非常常见的数据类型,用于存储和操作文本数据。在本文中,我们将介绍如何使用PHP中的字符串变量,并提供一些具体的代码示例。字符串变量的声明和赋值在PHP中,要声明一个字符串变量,只需要使...

  • 二进制算法怎么算

    二进制算法怎么算

    二进制算法是一种基于二进制数的运算方法,其基本运算包括加法、减法、乘法和除法。除了基本运算外,二进制算法还包括逻辑运算、位移运算等操作。逻辑运算包括与、或、非等操作,位移运算包括左移和右移操作。这些操作都有对应的规则和操作数的要求。二进制算...

  • DTW算法是什么

    DTW算法是什么

    dtw算法是指动态时间规整算法,是基于动态规划dp的思想,是一种计算2个时间序列尤其是不同长度序列相似度的一种动态规划算法;它解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典的一种算法。dtw算法主要应用在时序数据上,比如孤...

  • javascript如何将数组转换为字符串

    javascript如何将数组转换为字符串

    javascript将数组转换为字符串的方法:1、使用join()函数,将数组元素用分隔符连接起来以构建一个字符串,语法格式“arr.join("分隔符")”;2、使用tostring()函数,语法格式“string(a......

  • php怎么将一个字符串转成数组(三种方法)

    php怎么将一个字符串转成数组(三种方法)

    在php中,有时候我们需要将一个字符串转换成数组,以方便对其进行操作和处理。以下是一些简单的方法来实现这个目标。方法一:使用explode()函数explode()函数可以将一个字符串分割成数组。它需要两个参数:一个分割符和一个字符串。分割...

  • javascript如何获取字符串长度

    javascript如何获取字符串长度

    javascript获取字符串长度的方法:1、使用length属性按字符来获取字符串长度,语法“字符串.length”;2、利用charcodeat()按字节来获取字符串长度。本教程操作环境:windows7系统、javascript1.8...

  • 字符串如何比较大小

    字符串如何比较大小

    字符串比较大小的步骤:1、将要比较的两个字符串分别赋给两个变量;2、比较两个字符串的长度,较短的字符串将被认为是较小的字符串;3、如果长度相同,逐个比较它们的字符;4、从字符串的第一个字符开始,比较两个字符串的ascii值;5、如果asci...

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

精彩推荐