C++ Boyer Moore 模式搜索算法28 Aug 2024 | 5 分钟阅读 模式识别是计算机科学领域中的一个重要问题。当我们在记事本/Word文档、浏览器或数据库中搜索字符串时,模式搜索方法会显示搜索结果。下面是一个问题描述的示例: 给定一个字符串 text[0..n-1] 和一个模式 pattern[0..m-1],编写一个函数search(char pattern[], char text[]),输出text[]中pattern[]的所有实例。您可以假设n > m。在我们深入探讨如何搜索或识别字符串中给定模式的出现之前,让我们首先回顾一下什么是字符串。 字符串表示一种不可变数据类型,用于存储字符序列。字符串是任何计算机语言中最常用的数据类型。使用引号(单引号或双引号)可以轻松创建字符串。 我们现在可以应用Boyer Moore模式搜索方法(或B-M算法)来在字符串中查找模式。Boyer-Moore算法的概念很简单:两个指针分别对齐文本字符串和相应字符字符串的第0个位置。如果字符不同,Boyer-Moore算法会以两种方式同时移动字符。所以,我们可以说Boyer-Moore算法是两种技术的混合:
方法1:坏字符启发式如果找到匹配,则返回模式的起始索引。否则,有两种可能性: 当模式包含与输入文本中不匹配的字符时在这种情况下,该字符被称为坏字符。当识别出坏字符时,我们将移动模式,直到它与不匹配的文本字符匹配。 考虑模式字符串和输入文本不直接匹配的情况。假设模式字符串是"WORLD",输入文本是"HELLOHELLO"。我们将使用Boyer-Moore字符串搜索技术来查找与输入文本匹配的模式。 示例 模式:WORLD 字符串:HELLOHELLO 现在,让我们使用Boyer-Moore技术将模式与输入文本进行比较: 步骤1:检查最后两个字符,D 和 O。它们不兼容。 在此示例中,输入文本中模式内没有不匹配的字符。使用坏字符规则,计算机会更改模式以与不匹配的字符对应。 移位后 模式:WORLD 输入文本:HELLOHELLO 步骤2:匹配最后两个字符,D 和 L。它们不兼容。 按长度更改模式并再次运行坏字符条件。 移位后 模式:WORLD 输入文本:HELLOHELLO 此过程重复,直到模式针对整个输入文本进行测试,并且没有找到匹配,表明无法找到识别的模式。在此示例中,模式"WORLD"与输入字符串"HELLOHELLO"不对应。 文件名:PattrernMatch.cpp 输出 The pattern present at the position = 5 方法2:好后缀启发式。让我们看一个输入字符串"HelloWorld",模式为"WORLD",以演示Boyer-Moore方法如何使用好后缀启发式。 模式:WORLD 输入:HELLOWORLD 现在,将使用好后缀启发式方法将模式与输入文本进行比较:
文件名:PatternMatch2.cpp 输出 The pattern found at position = 0 The pattern found at position = 10 下一个主题C++ 实现游程编码和解码的程序 |
C++ 堆栈 在 C++ 中,堆是基于树的数据结构,主要用于优先队列和高效地检索最大或最小元素。C++ STL 提供了几个用于堆操作的内置函数,例如 make_heap()、push_heap()、pop_heap()、sort_heap()、is_heap 和 is_heap_until()。...
阅读 12 分钟
在 C++ 中,通过将坐标增加直到欧几里得距离 <= D 来找到获胜者 简介:在此 C++ 方法中,目标是通过系统地增加获胜坐标的值来确定一组获胜坐标,直到其与原点的欧几里得距离等于或小于指定的最小距离...
11 分钟阅读
在 C++ 中,如果基类中存在同名的多个重载方法,程序员可以使用 "using" 声明在派生类中隐藏它们。这被称为方法隐藏。在本文中,我们将讨论如何隐藏所有重载方法...
阅读 4 分钟
简介:C++ 中与字符串交互的默认方法称为 std::string,因为它为用户提供了广泛的有用功能。在许多其他字符串操作中,std::string 提供字符串操作,包括查找子字符串、比较字符串、连接字符串和切片字符串。但是每次...
5 分钟阅读
在计算机科学领域,存在一些复杂的问题和算法需要解决。其中一个问题是“名人格问题”,它围绕着识别一群人中的名人的任务。在这篇博文中,我们将深入探讨……
阅读 4 分钟
模式搜索是几乎所有计算机科学领域或算法中的一项基本或不可替代的操作。在解析文本、查找关键字和搜索数据中的序列时,高效的模式搜索算法非常关键。Aho-Corasick 算法是一种强大而通用的算法...
阅读 3 分钟
C++ 是一种强大且适应性强的编程语言,为开发人员提供了许多功能。对低级编程和性能优化的支持是 C++ 的主要特性之一。C++ 的一个重要组成部分是标准模板库 (STL),它提供了一组...
阅读 4 分钟
在此示例中,我们将讨论如何使用 C++ 中的正则表达式验证文件扩展名,并提供几个示例。介绍:图像文件验证在许多应用程序中都是一项非常重要的任务,尤其是在处理用户上传或外部数据源时。验证图像文件扩展名可确保...
7 分钟阅读
目标是确定使用 2 * N 个括号可以创建多少种不同的括号序列,给定一个整数 N,而序列不是 N 周期性的。如果序列可以被分成两个具有相同正则括号序列的相等子串,则该括号……
阅读 4 分钟
C++ 中的 Vector 是什么?在 C++ 中,vector 是一个序列容器,它在连续的内存块中存储相同类型的元素。Vector 中的每个元素都分配有一个数字索引,用于访问该元素。Vector 类似...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India