C#,字符串匹配(模式搜索)Boyer Moore算法的源代码

news2024/11/30 14:30:57

Boyer Moore 算法是字符串匹配(模式搜索)的主要高效算法之一。

Boyer-Moore(BM)算法被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore于1977年设计实现。通常情况下,Boyer Moore 算法比KMP算法快3-5倍。

BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较,而会跳过其中某些部分。通常搜索关键字越长,算法速度越快。它的效率来自于这样的事实:对于每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配的位置。即它充分利用待搜索字符串的一些特征,加快了搜索的步骤。

BM算法实际上包含两个并行的算法(也就是两个启发策略):坏字符算法(bad-character shift)和好后缀算法(good-suffix shift)。这两种算法的目的就是让模式串每次向右移动尽可能大的距离(即上面的BM()尽可能大)。

本代码运行效果:

源代码:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// 字符串匹配算法(模式搜索)Boyer Moore 算法
    /// </summary>
    public static partial class PatternSearch
    {
        /// <summary>
        /// “坏字符”限制(数组大小)
        /// 处理中文,这个要大大增加!!!!
        /// </summary>
        //private static int NO_OF_CHARS = 256;

        /// <summary>
        /// “坏字符启发式”的预处理函数
        /// The preprocessing function for bad character heuristic
        /// </summary>
        /// <param name="patternCharArray"></param>
        /// <param name="badcharArray"></param>
        public static void Bad_Char_Heuristic(char[] patternCharArray, out int[] badcharArray)
        {
            badcharArray = new int[ALPHA_CODE_MAX];
            for (int i = 0; i < ALPHA_CODE_MAX; i++)
            {
                badcharArray[i] = -1;
            }

            for (int i = 0; i < patternCharArray.Length; i++)
            {
                badcharArray[(int)patternCharArray[i]] = i;
            }
        }

        /// <summary>
        /// 使用了“坏字符启发式”的
        /// 字符串匹配算法(模式搜索)Boyer Moore 算法
        /// A pattern searching function that uses Bad
        /// Character Heuristic of Boyer Moore Algorithm
        /// </summary>
        /// <param name="text"></param>
        /// <param name="pattern"></param>
        public static List<int> Boyer_Moore_Search(string text, string pattern)
        {
            int m = pattern.Length;
            int n = text.Length;

            List<int> matchs = new List<int>();

            Bad_Char_Heuristic(pattern.ToCharArray(), out int[] badchar);
            
            int s = 0;
            while (s <= (n - m))
            {
                int j = m - 1;
                while (j >= 0 && pattern[j] == text[s + j])
                {
                    j--;
                }

                // 如果匹配串出现在当前位置
                if (j < 0)
                {
                    matchs.Add(s);

                    // 改变模式,使下一个文本中的字符与最后一个对齐它在匹配串中的出现。
                    // 条件s + m < n是,当匹配串出现在末端时的情况。
                    s += (s + m < n) ? m - badchar[text[s + m]] : 1;
                }
                else
                {
                    // 修改匹配数值,让“坏字符”在文本中与最后一次出现的是匹配串。
                    // max函数用于确保我们得到积极的转变。
                    // 如果最后一次坏字母在匹配串中的出现位于当前角色的右侧。
                    s += Math.Max(1, j - badchar[text[s + j]]);
                }
            }

            return matchs;
        }
    }
}
 

-----------------------------------------------------------------------

POWER BY TRUFFER.CN

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// 字符串匹配算法(模式搜索)Boyer Moore 算法
    /// </summary>
    public static partial class PatternSearch
    {
        /// <summary>
        /// “坏字符”限制(数组大小)
        /// 处理中文,这个要大大增加!!!!
        /// </summary>
        //private static int NO_OF_CHARS = 256;

        /// <summary>
        /// “坏字符启发式”的预处理函数
        /// The preprocessing function for bad character heuristic
        /// </summary>
        /// <param name="patternCharArray"></param>
        /// <param name="badcharArray"></param>
        public static void Bad_Char_Heuristic(char[] patternCharArray, out int[] badcharArray)
        {
            badcharArray = new int[ALPHA_CODE_MAX];
            for (int i = 0; i < ALPHA_CODE_MAX; i++)
            {
                badcharArray[i] = -1;
            }

            for (int i = 0; i < patternCharArray.Length; i++)
            {
                badcharArray[(int)patternCharArray[i]] = i;
            }
        }

        /// <summary>
        /// 使用了“坏字符启发式”的
        /// 字符串匹配算法(模式搜索)Boyer Moore 算法
        /// A pattern searching function that uses Bad
        /// Character Heuristic of Boyer Moore Algorithm
        /// </summary>
        /// <param name="text"></param>
        /// <param name="pattern"></param>
        public static List<int> Boyer_Moore_Search(string text, string pattern)
        {
            int m = pattern.Length;
            int n = text.Length;

            List<int> matchs = new List<int>();

            Bad_Char_Heuristic(pattern.ToCharArray(), out int[] badchar);
            
            int s = 0;
            while (s <= (n - m))
            {
                int j = m - 1;
                while (j >= 0 && pattern[j] == text[s + j])
                {
                    j--;
                }

                // 如果匹配串出现在当前位置
                if (j < 0)
                {
                    matchs.Add(s);

                    // 改变模式,使下一个文本中的字符与最后一个对齐它在匹配串中的出现。
                    // 条件s + m < n是,当匹配串出现在末端时的情况。
                    s += (s + m < n) ? m - badchar[text[s + m]] : 1;
                }
                else
                {
                    // 修改匹配数值,让“坏字符”在文本中与最后一次出现的是匹配串。
                    // max函数用于确保我们得到积极的转变。
                    // 如果最后一次坏字母在匹配串中的出现位于当前角色的右侧。
                    s += Math.Max(1, j - badchar[text[s + j]]);
                }
            }

            return matchs;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MIdjourney】几种独特的艺术风格

1.合成器波(Synthwave) Synthwave是一种音乐风格&#xff0c;起源于20世纪80年代电子音乐和电影的复古元素。这种音乐风格通常包括合成器音乐、电子鼓声和强烈的电子声效&#xff0c;以模拟80年代电影和视频游戏的声音。Synthwave的特点包括浓厚的合成器声音、强烈的节奏和对复…

2024年10大指纹浏览器推荐,不踩雷浏览器盘点

跨境安全离不开纯净代理与指纹浏览器的强强结合。在过去一年&#xff0c;IPFoxy纯净代理配合各大指纹浏览器完成了数千跨境账号的安全防护与高速浏览活动。结合广大用户真实体验与反馈&#xff0c;为大家盘里2024年最值得选择的十大指纹浏览器&#xff01; 1、AdsPower AdsPo…

postman案例

一、表单接口 基本正向 有效反向 无效反向 JSON接口 基本正向 有效反向 无效反向 文件上传接口 token 获取token值 一&#xff1a; 二&#xff1a; Bearer 获取的token的值&#xff0c;至于鉴权方式要根据swagger接口文档要求

医用一次性防护服行业研究:未来市场需求量继续巨大

目前&#xff0c;国标医用防护服生产大多采用环氧乙烷灭菌&#xff0c;但最大的缺点是需要很长时间通风以去除残留&#xff0c;整个灭菌时间较长&#xff0c;通常需要7-14天&#xff0c;而采用钴60或电子加速器辐照灭菌&#xff0c;无污染、无残留&#xff0c;不含有放射源&…

《计算机视觉处理设计开发工程师》

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

【Python3】【力扣题】389. 找不同

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;使用计数器分别统计字符串中的元素和出现次数&#xff0c;两个计数器相减&#xff0c;结果就是新添加的元素。 知识点&#xff1a;collections.Counter(...)&#xff1a;字典子类&#x…

leetcode—矩阵

1 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 方法一&#xf…

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…

【实战】Jmeter连接mongoDB数据库

作为一名测试人员&#xff0c;做接口测试难免要进行基础数据校验。Jmeter本身对mysql支持的非常好&#xff0c;但是对mongoDB、cassandra等数据库要怎么连接并校验数据呢&#xff1f;本文以mongodb为例进行说明。 一、如果你有Java基础&#xff0c;可以编写java代码访问mongo …

使用numpy创建数组

目录 一&#xff1a;使用numpy.array() 二&#xff1a;使用np.zeros() 三&#xff1a;np.full() 四&#xff1a;numpy.ones() 在Python的NumPy库中&#xff0c;有几种不同的方法可以创建数组。我们演示下不同方式创建数组的例子 一&#xff1a;使用numpy.array() np.array…

python 用bisect来管理已排序的序列

已排序的序列可以用来进行快速搜索&#xff0c;而标准库的 bisect 模块给我们提供了二分查找算法。bisect.insort 让已排序的序列保持有序 bisect 模块包含两个主要函数&#xff0c;bisect 和 insort&#xff0c;两个函数都利用二分查找算法来在有序序列中查找或插入元素。 用…

133基于matlab的智能微电网粒子群优化算法

基于matlab的智能微电网粒子群优化算法&#xff0c;输出微型燃气轮机、电网输入微网运行计划、储能运行计算。程序已调通&#xff0c;可直接运行。 133智能微电网粒子群优化算法 (xiaohongshu.com)

P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement 题解(SPJ!!!)

[ICPC2021 Nanjing R] Klee in Solitary Confinement 题面翻译 给定 n , k n,k n,k 和一个长为 n n n 的序列&#xff0c;你可以选择对区间 [ l , r ] [l, r] [l,r] 的数整体加上 k k k&#xff0c;也可以不加。最大化众数出现次数并输出。 题目描述 Since the travele…

Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)

作为一名从事网络安全的技术人员&#xff0c;不懂Kali Linux的话&#xff0c;连脚本小子都算不上。 Kali Linux预装了数百种享誉盛名的渗透工具&#xff0c;使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集&#xf…

Angular系列教程之变更检测与性能优化

文章目录 前言变更检测的原理脏检查OnPush策略 示例代码总结 前言 Angular 除了默认的变化检测机制&#xff0c;也提供了ChangeDetectionStrategy.OnPush&#xff0c;用 OnPush 可以跳过某个组件或者某个父组件以及它下面所有子组件的变化检测。 在本文中&#xff0c;我们将探…

最常见的十道面试题-反射与集合

面试题一&#xff1a;Java是值传递还是引用传递&#xff1f; Java是值传递。这意味着当将一个变量传给一个方法的时候&#xff0c;我们实际上是传递的是这个变量的的副本。 但是对于对象来说&#xff0c;我们传递的是其的副本&#xff0c;我们不可以改变对象的引用本身&#…

基于Java SSM框架实现智能停车场管理系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

Maven工程 — 继承与聚合 相关知识点详解

简介&#xff1a;这篇帖子主要讲解Maven工程中的继承与聚合的相关知识点&#xff0c;用简洁的语言和小编自己的理解&#xff0c;深入浅出的说明Maven工程的继承与聚合。 目录 1、继承 1.1 继承关系的实现 1.2 版本锁定 2、聚合 2.1 聚合方法 3、总结 1、继承 图 1-1 继承…

CORS漏洞学习

CORS漏洞属于一个协议漏洞&#xff0c;具体是由于同源策略的设置问题触发的漏洞&#xff0c;漏洞利用条件较为苛刻&#xff0c;但实战中也常见。 首先要了解同源策略 什么是同源策略&#xff1f; 同源策略是一种Web浏览器安全机制&#xff0c;旨在防止网站相互攻击。 同源策…