最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#實(shí)現(xiàn)sunday算法實(shí)例

 更新時(shí)間:2013年08月19日 16:34:16   作者:  
Sunday算法思想跟BM算法很相似,在匹配失敗時(shí)關(guān)注的是文本串中參加匹配的最末位字符的下一位字符,下面是用C#實(shí)現(xiàn)sunday的實(shí)例代碼,有需要的朋友可以參考一下

因正則表達(dá)式搜索總是出現(xiàn)死循環(huán),開始考慮改為其他搜索方式,因?yàn)?net自帶的IndexOf默認(rèn)只能找到第一個(gè)或最后一個(gè),如果要把全部的匹配項(xiàng)都找出來,還需要自己寫循環(huán)SubString,所以想找下有沒有現(xiàn)成的,就發(fā)現(xiàn)了在這個(gè)領(lǐng)域里,BM算法是王道,而sunday算法據(jù)說是目前最好的改進(jìn)版,這一點(diǎn)我沒有從國外的網(wǎng)站尤其是wiki上找到印證,但中文談?wù)搒unday的文章很多,我就姑且認(rèn)為它是最好的吧。

復(fù)制代碼 代碼如下:

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)在測試下性能:
復(fù)制代碼 代碼如下:

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í)有用。

但千萬不要使用substring來實(shí)現(xiàn)算法,那樣會(huì)新生成很多字符串中間變量,算法帶來的好處遠(yuǎn)遠(yuǎn)不如分配內(nèi)存復(fù)制字符串的消耗大,注釋掉的部分就是使用substring實(shí)現(xiàn)的,比indexof慢很多。

相關(guān)文章

  • ADO.NET實(shí)體數(shù)據(jù)模型詳細(xì)介紹

    ADO.NET實(shí)體數(shù)據(jù)模型詳細(xì)介紹

    本文將詳細(xì)介紹ADO.NET實(shí)體數(shù)據(jù)模型,下面先看看簡單的單表的增刪改查操作,然后再看多表的關(guān)聯(lián)查詢,帶參數(shù)查詢等
    2012-11-11
  • c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-05-05
  • Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換

    Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換

    這篇文章主要介紹了Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換的示例代碼,幫助大家更好的理解和使用winform開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • WPF實(shí)現(xiàn)Table布局控件的示例代碼

    WPF實(shí)現(xiàn)Table布局控件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)Table布局控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • Unity實(shí)現(xiàn)瞄準(zhǔn)鏡效果

    Unity實(shí)現(xiàn)瞄準(zhǔn)鏡效果

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)瞄準(zhǔn)鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#語言中字符類char的使用方法(總結(jié))

    C#語言中字符類char的使用方法(總結(jié))

    下面小編就為大家?guī)硪黄狢#語言中字符類char的使用方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體

    Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法

    C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法

    這篇文章主要介紹了C#遍歷文件夾及其子目錄的方法,涉及C#文件與目錄的基本操作技巧,簡單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • WPF字體或內(nèi)容模糊的解決方法

    WPF字體或內(nèi)容模糊的解決方法

    WPF下開發(fā)的程序字體模糊,這個(gè)問題或許大家都有遇到過,為了解決WPF字體模糊,查閱了各種資料,結(jié)果偶然發(fā)現(xiàn)是自己疏忽了一些細(xì)節(jié)造成的,具體是什么細(xì)節(jié)呢,通過下面的這篇文章來一起看看吧,有需要的朋友們可以參考借鑒。
    2016-12-12
  • C#與C++動(dòng)態(tài)鏈接庫DLL參數(shù)互傳方式

    C#與C++動(dòng)態(tài)鏈接庫DLL參數(shù)互傳方式

    這篇文章主要介紹了C#與C++動(dòng)態(tài)鏈接庫DLL參數(shù)互傳方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

揭西县| 奉贤区| 郯城县| 安溪县| 勃利县| 龙陵县| 英山县| 治多县| 喀喇| 八宿县| 会宁县| 定远县| 连云港市| 康保县| 贡山| 西华县| 新野县| 东莞市| 吉首市| 仁化县| 黄浦区| 新安县| 南昌县| 济阳县| 莱西市| 九龙城区| 峨边| 丹江口市| 仙游县| 青海省| 积石山| 广州市| 宣武区| 东至县| 华蓥市| 浦江县| 罗平县| 磐安县| 长沙县| 奉节县| 拜城县|