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

 M.O.Rabin

Rabin-Karp算法,是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。

通常基于散列值的字符串匹配方法:(1)首先计算模式字符串的散列函数;(2)然后利用相同的散列函数计算文本中所有可能的M个字符的子字符串的散列函数值并寻找匹配。但是这种方法比暴力查找还慢,因为计算散列值会涉及字符串中的每个字符。Rabin和Karp对上述方法进行了改进,设计实现了一种能够在常数时间内算出M个字符的子字符串散列值的方法。

运行效果:

源代码:

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

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class PatternSearch
    {
        public readonly static int ALPHA_CODE_MAX = 256;

        /// <summary>
        /// 字符串匹配算法(模式搜索)Rabin Karp 算法
        /// </summary>
        /// <param name="text"></param>
        /// <param name="pattern"></param>
        /// <param name="primeNumber"></param>
        /// <returns></returns>
        public static List<int> Rabin_Karp_Search( string text,string pattern, int primeNumber = 101)
        {
            List<int> matchs = new List<int>();

            int M = pattern.Length;
            int N = text.Length;

            int h = 1;
            for (int i = 0; i < M - 1; i++)
            {
                h = (h * ALPHA_CODE_MAX) % primeNumber;
            }

            int p = 0;
            int t = 0;
            for (int i = 0; i < M; i++)
            {
                p = (ALPHA_CODE_MAX * p + pattern[i]) % primeNumber;
                t = (ALPHA_CODE_MAX * t + text[i]) % primeNumber;
            }

            for (int i = 0; i <= N - M; i++)
            {
                if (p == t)
                {
                    int j;
                    for (j = 0; j < M; j++)
                    {
                        if (text[i + j] != pattern[j])
                        {
                            break;
                        }
                    }

                    if (j == M)
                    {
                        matchs.Add(i);
                    }
                }

                if (i < (N - M))
                {
                    t = (ALPHA_CODE_MAX * (t - text[i] * h) + text[i + M]) % primeNumber;
                    if (t < 0)
                    {
                        t = (t + primeNumber);
                    }
                }
            }

            return matchs;
        }
    }
}
 

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

POWER BY TRUFFER.CN

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class PatternSearch{public readonly static int ALPHA_CODE_MAX = 256;/// <summary>/// 字符串匹配算法(模式搜索)Rabin Karp 算法/// </summary>/// <param name="text"></param>/// <param name="pattern"></param>/// <param name="primeNumber"></param>/// <returns></returns>public static List<int> Rabin_Karp_Search( string text,string pattern, int primeNumber = 101){List<int> matchs = new List<int>();int M = pattern.Length;int N = text.Length;int h = 1;for (int i = 0; i < M - 1; i++){h = (h * ALPHA_CODE_MAX) % primeNumber;}int p = 0;int t = 0;for (int i = 0; i < M; i++){p = (ALPHA_CODE_MAX * p + pattern[i]) % primeNumber;t = (ALPHA_CODE_MAX * t + text[i]) % primeNumber;}for (int i = 0; i <= N - M; i++){if (p == t){int j;for (j = 0; j < M; j++){if (text[i + j] != pattern[j]){break;}}if (j == M){matchs.Add(i);}}if (i < (N - M)){t = (ALPHA_CODE_MAX * (t - text[i] * h) + text[i + M]) % primeNumber;if (t < 0){t = (t + primeNumber);}}}return matchs;}}
}

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

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

相关文章

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素&#xff0c;并且上传任意文件都会跳转到upload.php页面&#xff0c;判定是一个apache容器&#xff0c;开始扫描…

YoloV5改进策略:BAM瓶颈注意力模块|BAM详解以及代码注释|CBAM姊妹篇|有效涨点

论文:《BAM:瓶颈注意力模块》 https://arxiv.org/pdf/1807.06514.pdf 近期深度神经网络的进展主要通过架构搜索来增强其表示能力。在这项工作中,我们专注于注意力在一般深度神经网络中的作用。我们提出了一种简单而有效的注意力模块,名为瓶颈注意力模块(BAM),可以与任何…

IntelliJ IDEA 中输出乱码解决

最近tomcat突然在控制台输出乱码&#xff0c;各种乱码问题&#xff0c;查阅大量的资料&#xff0c;最终得以解决. IDEA控制台输出乱码 问题一&#xff1a;idea中tomcat控制台输出乱码 运行本地的tomcat\bin\start.bat文件页面显示正常 在idea中显示乱码 解决&#xff1a; 根…

WebRTC视频会议/视频客服系统EasyRTC进入会议室密码验证的开发与实现

基于WebRTC技术的EasyRTC视频会议系统&#xff0c;建设目标是让用户随时随地、快捷方便地进行视频会议&#xff0c;并根据行业需求有针对性地提供多样化、个性化功能&#xff0c;该系统是覆盖全球的实时音视频开发平台&#xff0c;支持一对一、一对多等视频通话&#xff0c;极大…

梳理从MVP变换到光栅化的过程

1.梳理从MVP变换到光栅化的过程 相关博客&#xff1a; 1.MVP变换 2.Rasterization&#xff08;光栅化&#xff09; 1.1 View/Camera transformation 此例中相机初始位置为&#xff08;0,0,5&#xff09;【备注&#xff1a;详见主函数中输入的值】经过 M view M_{\text{view}}…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-贴子列表分页显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

【算法题】61. 旋转链表

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#xff1a…

使用 ClassFinal 对SpringBoot jar加密加固并进行机器绑定

写在前面&#xff1a;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01;如果我的博客对你有帮助&#xff0c;欢迎进行评论✏️✏️、点赞&#x1f44d;&#x1f44d;、收藏⭐️⭐️&#…

RabbitMQ扩展

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 RabbitMQ扩展 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、高级特性消费端限流不公…

【正点原子STM32】初识STM32(芯片分类、资料下载、命名规则、选型)

一、STM32是什么 二、STM32芯片分类 三、STM32命名规则 四、STM32选型 五、总结 一、STM32是什么 STM32是STMicroelectronics&#xff08;意法半导体&#xff09;公司推出的一系列32位的嵌入式系统微控制器&#xff08;Microcontroller Unit&#xff0c;MCU&#xff09;产品。…

ThinkPHP6如何轻松集成缓存技术?

随着网络技术的不断发展&#xff0c;缓存技术已经成为了现代化网站、应用开发中必不可少的一项技术。ThinkPHP作为国内最为流行的PHP开发框架之一&#xff0c;在其最新版本ThinkPHP6中&#xff0c;已经集成了多种缓存技术。本文将介绍ThinkPHP6集成缓存技术的实践&#xff0c;让…

网络安全 | 苹果承认 GPU 安全漏洞存在,iPhone 12、M2 MacBook Air 等受影响

1 月 17 日消息&#xff0c;苹果公司确认了近期出现的有关 Apple GPU 存在安全漏洞的报告&#xff0c;并承认 iPhone 12 和 M2 MacBook Air 受影响。 该漏洞可能使攻击者窃取由芯片处理的数据&#xff0c;包括与 ChatGPT 的对话内容等隐私信息。 安全研究人员发现&#xff0c;…

策略模式在工作中的运用

前言 在不同的场景下&#xff0c;执行不同的业务逻辑&#xff0c;在日常工作中是很寻常的事情。比如&#xff0c;订阅系统。在收到阿里云的回调事件、与收到AWS的回调事件&#xff0c;无论是收到的参数&#xff0c;还是执行的逻辑都可能是不同的。为了避免&#xff0c;每次新增…

零售的数字化转型,利用AWS云服务资源如何操作?

国内市场趋于饱满&#xff0c;各行各业的发展接近瓶颈&#xff0c;就连零售行业都竞争激烈&#xff0c;随处可见的零售小店也预示着需要投入大量的人力&#xff0c;而且由于消费者的行为和预期已经发生了根本性变化&#xff0c;这迫使零售商不得不加速整个价值链的数字化转型&a…

在rk3568上执行/usr/bin/QLauncher,报错

环境&#xff1a;rk3568 Linux buildroot系统&#xff0c;接mipi屏幕。 执行/usr/bin/QLauncher报错如下&#xff1a; rootrk3568-buildroot:/# /usr/bin/QLauncher Failed to create wl_display (No such file or directory) qt.qpa.plugin: Could not load the Qt platform …

js构造继承是什么缺点和优点

构造继承是一种继承方式&#xff0c;通过使用构造函数来实现继承。在JavaScript中&#xff0c;构造继承是最早的继承方式之一&#xff0c;但随着ES6引入了类和基于类的继承方式&#xff0c;构造继承的应用逐渐减少。 构造继承的优点&#xff1a; 简单易用&#xff1a;构造继承…

java基础算法之堆排序算法

堆排序是一种将顺序存储二叉树转化为大顶堆或者小顶堆的排序算法。顺序存储二叉树是一种特殊的二叉树存储方式&#xff0c;它将二叉树的节点按照一定的逻辑顺序存储在一个数组中&#xff0c;以便快速访问节点。大顶堆&#xff1a;父节点的值大于或等于其子节点的值的树&#xf…

Flutter 缩放动画组件封装与使用

在 Flutter 中&#xff0c;动画是为了提升用户体验而不可或缺的一部分。在应用程序中&#xff0c;缩放动画是常用的一种交互效果&#xff0c;可以使界面元素在用户交互时具有生动感。为了更好地组织代码和提高复用性&#xff0c;我们可以封装一个缩放动画组件&#xff0c;以下是…

Java中List接口两个实现,ArrayList类和LinkedList类的常用方法(一)

List接口 要了解List接口&#xff0c;就不得不说起Java的集合框架。 &#xff08;该图来自菜鸟教程&#xff09; Collection接口和Map接口 Java 集合框架主要包括两种类型的容器&#xff0c;集合Collection和图Map。 Collection接口代表了单列集合&#xff0c;它包含了一组…

1月下半笔记(个人向)

最近才开始看d2l&#xff08;这种东西早该在两年前看的&#xff0c;拖到现在了&#xff09; 为了做项目还得学一手OpenGL&#xff08;被windows安装GLFW逼疯了&#xff09; 1.15 打完ICPC EC final回来&#xff0c;也许可以出一篇博客写下简单的题解。 对蛋白质相似空间子结…