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;
?? ??? ?}
?? ?}
}
?——————————————————————
POWER BY 315SOFT.COM &
TRUFFER.CN
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;
?? ??? ?}
?? ?}
}