Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。
核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。
Sunday算法思想跟BM(Boyer Moore)算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即:移动步长=匹配串长度+1;否则,同BM算法一样,其移动步长=匹配串中最右端的该字符到末尾的距离+1。
本代码运行效果:
源代码:
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class PatternSearch
{
/// <summary>
/// 字符位置表
/// </summary>
private static int ALPHA_BET = 512;
/// <summary>
/// 计算字符的出现位置表
/// </summary>
/// <param name="pattern"></param>
/// <returns></returns>
private static int[] ComputeOccurence(string pattern)
{
int[] table = new int[ALPHA_BET];
for (char a = (char)0; a < (char)ALPHA_BET; a++)
{
table[(int)a] = -1;
}
for (int i = 0; i < pattern.Length; i++)
{
char a = pattern[i];
table[(int)a] = i;
}
return table;
}
/// <summary>
/// 字符串匹配算法(模式搜索)Sunday算法
/// </summary>
/// <param name="text"></param>
/// <param name="pattern"></param>
/// <returns></returns>
public static List<int> Sunday_Search(string text, string pattern)
{
List<int> matchs = new List<int>();
int i = 0;
int[] table = ComputeOccurence(pattern);
while (i <= text.Length - pattern.Length)
{
int j = 0;
while (j < pattern.Length && text[i + j] == pattern[j])
{
j++;
}
if (j == pattern.Length)
{
matchs.Add(i);
}
i += pattern.Length;
if (i < text.Length)
{
i -= table[(int)text[i]];
}
}
return matchs;
}
}
}
——————————————————————文章来源:https://www.toymoban.com/news/detail-819288.html
POWER BY 315SOFT.COM &
TRUFFER.CN文章来源地址https://www.toymoban.com/news/detail-819288.html
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public static partial class PatternSearch
{
/// <summary>
/// 字符位置表
/// </summary>
private static int ALPHA_BET = 512;
/// <summary>
/// 计算字符的出现位置表
/// </summary>
/// <param name="pattern"></param>
/// <returns></returns>
private static int[] ComputeOccurence(string pattern)
{
int[] table = new int[ALPHA_BET];
for (char a = (char)0; a < (char)ALPHA_BET; a++)
{
table[(int)a] = -1;
}
for (int i = 0; i < pattern.Length; i++)
{
char a = pattern[i];
table[(int)a] = i;
}
return table;
}
/// <summary>
/// 字符串匹配算法(模式搜索)Sunday算法
/// </summary>
/// <param name="text"></param>
/// <param name="pattern"></param>
/// <returns></returns>
public static List<int> Sunday_Search(string text, string pattern)
{
List<int> matchs = new List<int>();
int i = 0;
int[] table = ComputeOccurence(pattern);
while (i <= text.Length - pattern.Length)
{
int j = 0;
while (j < pattern.Length && text[i + j] == pattern[j])
{
j++;
}
if (j == pattern.Length)
{
matchs.Add(i);
}
i += pattern.Length;
if (i < text.Length)
{
i -= table[(int)text[i]];
}
}
return matchs;
}
}
}
到了这里,关于C#,字符串匹配(模式搜索)Sunday算法的源代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!