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.hqwc.cn/news/414914.html

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

相关文章

虚拟线程探索与实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

k8s---ingress对外服务(traefik)

目录 ingress的证书访问 traefik traefik的部署方式&#xff1a; deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress的证书访问 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secre…

【SpringBoot3】IDEA常用插件介绍Tabnine,GsonFormat,Maven Helper等

文章目录 一、Tabnine二、Auto filling Java call arguments三、GsonFormat四、Rainbow Brackets五、Maven Helper 本文主要介绍一些比较实用的IDEA插件&#xff0c;帮助广大开发者提升开发效率&#xff0c;愉悦编码&#xff01; 一、Tabnine 官网地址&#xff1a;https://ww…

被动元件大厂村田停工近半年 | 百能云芯

据市场传言&#xff0c;受到地震影响&#xff0c;日本被动元件巨头村田的产线&#xff0c;尤其是生产电感的穴水村田制作所&#xff0c;将至少停工至5月中旬。这一消息引发了业界对于台湾厂商是否能够迎来转单效应的猜测。尽管目前转单效益尚不明朗&#xff0c;业内普遍认为&am…

Java项目:10 Springboot的电商书城管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 该系统分为前台展示和后台管理两大模块&#xff0c;前台主要是为消费者服务。该子系统实现了注册&#xff0c;登录&#xff0c;以及从浏览、下…

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…

商用软件方案的多种交付方式有什么优势?

商用软件方案在交付上&#xff0c;往往存在多种模式&#xff0c;包括SaaS模式、私有化部署、SDK嵌入式等等&#xff0c;SaaS模式讲究一个标准化&#xff0c;旨在最大限度的降低部署成本&#xff0c;但对于一些定制化程度比较高的需求&#xff0c;往往企业仍然需要采用私有化部署…

问题 sr failed: CUDA out of memory. Tried to allocate 解决

一 错误信息&#xff1a;sr failed: CUDA out of memory sr failed: CUDA out of memory. Tried to allocate 370.00 MiB. GPU 0 has a total capacty of 12.00 GiB of which 8.66 GiB is free. Of the allocated memory 969.24 MiB is allocated by PyTorch, and 306.76 MiB …

ubuntu20.04一键通过docker-compose部署mysql 8.0.20

os&#xff1a;ubuntu20.04 docker&#xff1a;v24 docker-compose&#xff1a;v2.2.2 主要步骤 1.拉取镜像 docker pull mysql:8.0.20 2.创建目录 mkdir -p /data/docker_mysql/log mkdir -p /data/docker_mysql/data mkdir -p /data/docker_mysql/conf.d 3.创建配置文…

使用 TurfJS 寻找垂直线

在最近的一个项目中有个需求&#xff0c;我需要确定从单个点 © 到由其他两个点&#xff08;A 和 B&#xff09;的连线的垂直距离。通常我们可以只使用turf.nearestPointOnLine()&#xff0c;但是只有当C点位于前两点之间时才有效。 但是点 C 可以在任何位置&#xff0c;不…

axios的基础使用

在阅读本篇文章之前&#xff0c;可以阅读一下这篇文章 json-server的基础使用 因为我们接下来需要使用到json-server 在使用axios之前我们需要导入axios 介绍2种情况&#xff1a; 一、在项目中使用 我们一般都是使用以下两种方法安装 npm i axios yarn add axios二、在普通学习…

HarmonyOS—开发环境诊断的功能

为了大家开发应用/服务的良好体验&#xff0c;DevEco Studio提供了开发环境诊断的功能&#xff0c;帮助大家识别开发环境是否完备。可以在欢迎界面单击Help > Diagnose Development Environment进行诊断。如果已经打开了工程开发界面&#xff0c;也可以在菜单栏单击Help >…