c#實(shí)現(xiàn)sunday算法實(shí)例
因正則表達(dá)式搜索總是出現(xiàn)死循環(huán),開(kāi)始考慮改為其他搜索方式,因?yàn)?net自帶的IndexOf默認(rèn)只能找到第一個(gè)或最后一個(gè),如果要把全部的匹配項(xiàng)都找出來(lái),還需要自己寫(xiě)循環(huán)SubString,所以想找下有沒(méi)有現(xiàn)成的,就發(fā)現(xiàn)了在這個(gè)領(lǐng)域里,BM算法是王道,而sunday算法據(jù)說(shuō)是目前最好的改進(jìn)版,這一點(diǎn)我沒(méi)有從國(guó)外的網(wǎng)站尤其是wiki上找到印證,但中文談?wù)搒unday的文章很多,我就姑且認(rèn)為它是最好的吧。
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;
}
好了,現(xiàn)在測(cè)試下性能:
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算法耗時(shí)大概是indexof的20%左右。算法確實(shí)有用。
但千萬(wàn)不要使用substring來(lái)實(shí)現(xiàn)算法,那樣會(huì)新生成很多字符串中間變量,算法帶來(lái)的好處遠(yuǎn)遠(yuǎn)不如分配內(nèi)存復(fù)制字符串的消耗大,注釋掉的部分就是使用substring實(shí)現(xiàn)的,比indexof慢很多。
- 解析C#彩色圖像灰度化算法的實(shí)現(xiàn)代碼詳解
- c#中實(shí)現(xiàn)圖片灰度化技術(shù)詳解
- C#實(shí)現(xiàn)把彩色圖片灰度化代碼分享
- C#灰度化圖像的實(shí)例代碼
- 基于c#圖像灰度化、灰度反轉(zhuǎn)、二值化的實(shí)現(xiàn)方法詳解
- KMP算法的C#實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)排列組合算法完整實(shí)例
- 基于私鑰加密公鑰解密的RSA算法C#實(shí)現(xiàn)方法
- c#冒泡排序算法示例
- c#哈希算法的實(shí)現(xiàn)方法及思路
- C#計(jì)算兩個(gè)文件的相對(duì)目錄算法的實(shí)例代碼
- C#加密算法匯總(推薦)
- C#實(shí)現(xiàn)協(xié)同過(guò)濾算法的實(shí)例代碼
- C#彩色圖片灰度化算法實(shí)例
相關(guān)文章
在Winform和WPF中注冊(cè)全局快捷鍵實(shí)現(xiàn)思路及代碼
如果注冊(cè)快捷鍵,RegisterHotKey中的fsModifiers參數(shù)為0,即None選項(xiàng),一些安全軟件會(huì)警報(bào),可能因?yàn)檫@樣就可以全局監(jiān)聽(tīng)鍵盤(pán)而造成安全問(wèn)題,感興趣的你可以參考下本文2013-02-02C#中Trim()、TrimStart()、TrimEnd()的用法介紹
這篇文章主要介紹了C#中Trim()、TrimStart()、TrimEnd()的用法,有需要的朋友可以參考一下2014-01-01C#難點(diǎn)逐個(gè)擊破(3):params數(shù)組參數(shù)
注意,這里的paras全稱(chēng)是array parameter,也就是數(shù)組參數(shù)。 paras類(lèi)型參數(shù)主要用于在對(duì)數(shù)組長(zhǎng)度未知(可變)的情況下進(jìn)行函數(shù)聲明。2010-02-02C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例
PowerPoint演示文稿是我們?nèi)粘9ぷ髦谐S玫霓k公軟件之一,本篇文章介紹了C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12C#實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的方法
這篇文章主要介紹了C#實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的方法,通過(guò)封裝的類(lèi)文件實(shí)例化調(diào)用實(shí)現(xiàn)了對(duì)身份證號(hào)碼的驗(yàn)證,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11C#訪問(wèn)C++動(dòng)態(tài)分配的數(shù)組指針(實(shí)例講解)
下面小編就為大家分享一篇C#訪問(wèn)C++動(dòng)態(tài)分配的數(shù)組指針(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12