- 相關推薦
c#實現sunday算法實例
Sunday算法思想跟BM算法很相似,在匹配失敗時關注的是文本串中參加匹配的最末位字符的下一位字符,下面小編為大家整理了c#實現sunday算法實例,希望能幫到大家!
因正則表達式搜索總是出現死循環,開始考慮改為其他搜索方式,因為.net自帶的IndexOf默認只能找到第一個或最后一個,如果要把全部的匹配項都找出來,還需要自己寫循環SubString,所以想找下有沒有現成的,就發現了在這個領域里,BM算法是王道,而sunday算法據說是目前最好的改進版,這一點我沒有從國外的網站尤其是wiki上找到印證,但中文談論sunday的文章很多,我就姑且認為它是最好的吧。
復制代碼 代碼如下:
public static int SundaySearch(string text, string pattern)
{
int i = 0;
int j = 0;
int m = pattern.Length ;
int matchPosition = i;
while (i < text.Length && j < pattern.Length)
{
if (text[i] == pattern[j])
{
i++;
j++;
}
else
{
if(m==text.Length-1)break;
int k = pattern.Length - 1;
while (k >= 0 && text[m ] != pattern[k])
{
k--;
}
int gap = pattern.Length - k;
i += gap;
m = i + pattern.Length;
if (m > text.Length) m = text.Length - 1;
matchPosition = i;
j = 0;
}
}
if (i <= text.Length)
{
return matchPosition;
}
return -1;
}
好了,現在測試下性能:
復制代碼 代碼如下:
public static void PerformanceTest()
{
StreamReader reader = new StreamReader("D:LogConfiguration.xml", Encoding.ASCII);
string context = reader.ReadToEnd();
string pattern = "xxxx";
int count = 1000*10;
Stopwatch watch=new Stopwatch();
//watch.Start();
//for (int i = 0; i < count; i++)
//{
// int pos= Sunday.GetPositionFirst(context, pattern, true);
//}
//watch.Stop();
//Console.WriteLine(watch.ElapsedMilliseconds);
watch.Reset();
watch.Start();
for (int i = 0; i < count; i++)
{
int pos = context.IndexOf(pattern);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
watch.Reset();
watch.Start();
for (int i = 0; i < count; i++)
{
int pos = Sunday.SundaySearch(context, pattern);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
}
在可以找到匹配與不能找到匹配兩種情況下,sunday算法耗時大概是indexof的20%左右。算法確實有用。
但千萬不要使用substring來實現算法,那樣會新生成很多字符串中間變量,算法帶來的好處遠遠不如分配內存復制字符串的消耗大,注釋掉的部分就是使用substring實現的,比indexof慢很多。
【c#實現sunday算法實例】相關文章:
C#實現協同過濾算法的實例代碼06-19
C語言中實現KMP算法實例08-09
C語言實現歸并排序算法實例09-18
php:樹形結構的算法實例10-18
Java實現多繼承的實例07-18
C語言冒泡排序算法實例06-15
C#數據結構之循環鏈表的實例代碼10-22
PHP實現抽獎概率算法09-13
權重隨機算法的java實現08-13
C#抽象工廠模式的幾種實現方法及比較10-20