使用 Python 进行 Boyer Moore 算法模式搜索2025年3月17日 | 阅读 7 分钟 Boyer Moore 算法是模式匹配算法中最有效的一种。模式搜索方法在笔记本/文字文件、网页浏览器或数据库中查找字符串时显示搜索结果。一种常见的模式搜索技术是 Boyer Moore 字符串搜索技术,具有实际应用价值。 比 O(n) 更快的字符串搜索方法通常需要对文本进行一些预处理,如果频繁进行,这可能是计算密集型的,如果文本量很大,这可能是内存密集型的。Boyer Moore 要求要搜索的模式被预处理。 该算法首先预处理我们要搜索的字符串。从预处理中获得的信息将用于搜索算法的后续步骤。该算法的主要特点是匹配序列的尾部而不是头部,并以多个字符跳转的方式跳过文本,而不是检查文本中的每个字母。 问题陈述给定一个字符串 str[0….s - 1] 和一个模式字符串 ptn[0….p-1],其中 s 是字符串长度,p 是模式长度;我们需要创建一个函数来打印模式字符串在文本字符串中的所有出现。我们可以假设文本字符串的长度大于模式字符串的长度。 让我们通过几个例子来理解问题陈述。 示例 1 示例 2 ![]() 说明 用于存储字符和多个序列的不可变数据类型称为字符串。 如果我们看例子,我们从索引开始搜索模式。在第一个例子中,我们从索引 0 开始搜索模式“TEST”,并在索引 6 和 18 处找到模式。类似地,我们尝试在第二个例子中查找模式“ABBA”,并从第一个位置开始搜索。我们在第 4个 索引和第 11个 索引处找到了模式。 我们将使用 Boyer Moore 算法在字符串中搜索模式,其中分配了两个指针,它们在字符串中搜索模式。指针被分配到字符串的第 0个 索引和字符字符串。该算法从最后一个字符开始搜索模式。然后,从右边最后一个字符开始,将模式与其当前位置进行比较。 当字符不匹配时,Boyer-Moore 算法以两种方式同时移动字符
坏字符启发式当算法在字符串中找不到模式时,它会给出两种不同的情况
在这些情况下,不匹配的字符称为坏字符。当发现不匹配的字符时,我们会移动模式,直到它匹配字符串中的字符。 例如,我们在字符串 ABPRPXCPREDFT 中搜索模式 PCERST。当我们将模式字符串与文本字符串进行比较时,我们发现字符串中的字符 P(坏字符)和模式中的字符 E 之间存在不匹配。然后,我们将模式字符串移动,直到模式字符串的字符 P 与文本字符串的字符 P 匹配。 说明 我们从索引 0 开始在文本字符串中搜索模式,发现第一个字符与模式字符不匹配。然后,我们移动模式以匹配文本字符串。
为了理解这种情况,让我们举个例子:我们需要在字符串 ABPRPXCPREDFT 中搜索模式字符串 PCERST。我们将从右到左比较模式。 ![]() 坏字符启发式的实现代码 输出 The Pattern found at index: 7 坏字符启发式的复杂度分析 在此方法中,我们遍历了文本字符串的每个部分。 时间复杂度 此方法的时间复杂度为O (n x m),其中 n 是文本长度,m 是模式长度。 空间复杂度 预处理数组不使用额外的空间。因此,空间复杂度为 (O (1))。 好后缀启发式使用 Boyer-Moore 算法搜索模式的另一种方法是首先找到好后缀,然后对其进行分析。基本思想是对齐模式和文本字符串的重叠区域,以便在发生不匹配时更有效地进行移位。 让我们借助一个例子来理解这种情况。取一个模式并从右侧开始搜索。假设模式字符串的一部分已找到。我们将一直搜索直到找到不匹配。匹配的模式或与文本字符串匹配的模式部分称为好字符串。文本中的任何不匹配都意味着当前位置不是模式字符串的起始位置。现在,我们将模式移到下一个位置进行搜索。好后缀可用于移位模式。 我们在以下两种情况下使用好后缀 1. 好后缀在模式中的位置不同 例如,文本字符串是 AABBCAABBGCAABBAA,模式字符串是 AABBAA;我们可以看到好字符串(模式字符串的一部分与文本字符串匹配)出现在不同的位置。我们将好后缀移位,使其与文本对齐,并且模式文本与文本字符串匹配。 2. 好后缀的某一部分是模式的前缀 在搜索过程中,我们在模式中发现不匹配,但好字符串不完全匹配。如果好后缀被找到为模式的前缀,我们可以移位该后缀以使模式与文本字符串对齐。 ![]() 好字符启发式的实现代码 输出 The Pattern is found at index: 4 The Pattern is found at index: 13 好字符启发式的复杂度分析 在此方法中,我们遍历了模式字符串,并预处理了字符串以进行后缀和前缀。 时间复杂度 此方法的时间复杂度为O (m x n),其中 m 是文本长度,n 是模式长度。 空间复杂度 此方法的空间复杂度为[O (n) + O (n)],即 O (m),其中 m = n + n。 下一主题Python 函数的清理技巧 |
在我们的环境中,数据随机分布,其中一些数据指的是数据集曲线的峰值,而一些数据点指的是曲线的尾部。对于任何数据集,我们都可以使用其方差和均值来计算分布...
阅读 3 分钟
| Django 和 Node JS 之间的区别 在本教程中,我们将讨论两种流行技术 Django 和 Node JS 之间的主要区别。本教程将为您提供对这两种技术的深入分析,帮助您为项目选择合适的语言或...
5 分钟阅读
许多网站会提供关于任何技术的最新新闻,而文章可以通过其收到的评论数量来评估。如果新闻是关于加密货币的,并且文章取自 cointelegraph.com,我们可以轻松地计算并存储每条新闻...
阅读 6 分钟
在本教程中,我们将学习如何从字符串中删除单引号。有时,我们必须删除所有部分或仅删除字符串周围的部分。我们也可以删除单引号和双引号。我们将使用各种方法来删除引号;你可以...
阅读 2 分钟
文本消息可以使用摩尔斯电码方法进行通信,方法是输入一系列电脉冲,通常显示为短脉冲(称为“点”)和长脉冲(“破折号”)。塞缪尔·F·B·摩尔斯在 19 世纪 40 年代创建了该代码,用于...
阅读 16 分钟
简介:在本文中,我们将讨论 Python 解析时间戳。在数据库中保存日期和实例的最常见方式是使用时间戳。如果您在将日期和时间存储在数据库之前收到的是字符串格式,请先将日期转换为...
阅读 3 分钟
在 Python 中,列表包含多种数据,包括字符串和整数。所有项目都用逗号分隔;列表通过将值括在方括号中来表示。我们可以使用 Python 内置的 len() 方法来确定列表的长度。要计算列表的长度...
阅读 3 分钟
? 是的,Python 是一种脚本语言、通用、高级和解释型编程语言。它还提供面向对象编程方法。Python 的文件名扩展名可以是多种类型,例如 .py、.pyw、.pyc、.pyd、.pyz。什么是脚本语言?脚本语言指的是执行基于...
阅读1分钟
PyQt5 是一个功能强大的 Python 库,它允许开发人员轻松创建 paas 平台桌面应用程序。在各种小部件中,QDoubleSpinBox 作为处理浮点数字输入的宝贵工具而脱颖而出。在本文中,我们将讨论 QDoubleSpinBox 的一个重要方面 -...
阅读 4 分钟
?假设您在 Python 社区待了一段时间。那么,您可能会回忆起关于 Python 2 与 Python 3 的对话,或者您可能已经观察到 Python 3.10 和 Python 3.11 等版本的发布,并伴随着相当大的兴奋。您可能已经观察到......
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India