0
点赞
收藏
分享

微信扫一扫

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

芥子书屋 2022-04-14 阅读 36

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

举报

相关推荐

0 条评论