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

这篇具有很好参考价值的文章主要介绍了C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

alpha_code_max,C#算法演义 Algorithm Recipes,c#,算法,字符串查找算法

 M.O.Rabin

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

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

alpha_code_max,C#算法演义 Algorithm Recipes,c#,算法,字符串查找算法

运行效果:

alpha_code_max,C#算法演义 Algorithm Recipes,c#,算法,字符串查找算法

源代码:

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文章来源地址https://www.toymoban.com/news/detail-803868.html

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;
        }
    }
}

到了这里,关于C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】数组和字符串(十四):字符串匹配1:朴素的模式匹配算法(StringMatching)

      字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列,简称为串。例如 “good morning”就是由12个字符构成的一个字符串。一般把字符串记作: S = ′ ′ a 0 a 1 … a n − 1 ′ ′ S=\\\'\\\'a_{0} a_{1}…a_{n-1}\\\'\\\' S = ′′ a 0 ​ a 1 ​ … a n − 1 ′′ ​   其中S是串名,引号中

    2024年02月05日
    浏览(52)
  • PTA 7-1 字符串模式匹配(KMP)

    给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。 输入格式: 输入共两行,分别是字符串text 和模式串pattern。 输出格式: 输出一个整数,表示 pattern 在 text 中的出

    2024年02月06日
    浏览(27)
  • 数据结构课设:基于字符串模式匹配算法的病毒感染检测问题

    1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配算法BF算法或KMP算法的实现。 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了

    2023年04月27日
    浏览(35)
  • 【字符串匹配】暴力匹配算法

    ​ 暴力匹配算法,也称为朴素字符串匹配算法,是一种简单但不高效的字符串匹配方法。它的原理非常直观,其主要思想是逐个字符地比较文本串和模式串,从文本串的每个可能的起始位置开始,依次检查是否有匹配的子串。以下是暴力匹配算法的详细原理: 1. 一个字一个

    2024年02月09日
    浏览(36)
  • 字符串查找匹配算法

    字符串匹配(查找)是字符串的一种基本操作:给定带匹配查询的文本串S和目标子串T,T也叫做模式串。在文本S中找到一个和模式T相符的子字符串,并返回该子字符串在文本中的位置。 Brute Force Algorithm,也叫朴素字符串匹配算法,Naive String Matching Algorithm。 基本思路就是将

    2024年02月14日
    浏览(43)
  • python字符串模糊匹配,并计算匹配分数

    thefuzz包以前叫fuzzywuzzy,0.19版本开始改名为thefuzz,github地址: GitHub - seatgeek/thefuzz: Fuzzy String Matching in Python 可以通过命令pip install thefuzz安装此包。用法还是比较简单的: 上面两个字符串的相似度为89%。 我们先看看这个包下面的源码,来查看thefuzz是怎么实现模糊匹配的。the

    2023年04月23日
    浏览(74)
  • 【kmp算法】字符串匹配

    kmp算法解决的是字符串匹配的问题,具体来说假定我们要在主串s[ ] 中匹配模式串p[ ],找到匹配到的位置loc; 最自然的想法是暴力写法 (BF)枚举主串字符s[ i ] ,和模式串p[ j ]。一个一个匹配,如果匹配失败,i指针回退回起点,往前进一位,再次进行比较,知道匹配成功。

    2024年02月04日
    浏览(47)
  • 字符串匹配-KMP算法

    KMP算法,字符串匹配算法,给定一个主串S,和一个字串T,返回字串T与之S匹配的数组下标。 在学KMP算法之前,对于两个字符串,主串S,和字串T,我们根据暴力匹配,定义两个指针,i指向主串S的起始,j指向字串T的起始,依次比较,如果 主串i位置的值等于子串j位置的值,

    2024年02月14日
    浏览(36)
  • 字符串匹配算法:KMP

    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是 O(m+n) 字

    2024年02月06日
    浏览(47)
  • 动态规划--通配字符串匹配

    1. 题目来源 链接:通配符匹配 来源:LeetCode 2. 题目说明 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。 ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明: s 可能为

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包