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

C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码_第1张图片

 M.O.Rabin

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

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

C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码_第2张图片

运行效果:

C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码_第3张图片

源代码:

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;

        ///


        /// 字符串匹配算法(模式搜索)Rabin Karp 算法
        ///

        ///
        ///
        ///
        ///
        public static List Rabin_Karp_Search( string text,string pattern, int primeNumber = 101)
        {
            List matchs = new List();

            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;

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

            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#算法演义,Algorithm,Recipes,c#,算法,字符串查找算法)