欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

因正則表達(dá)式搜索總是出現(xiàn)死循環(huán),開始考慮改為其他搜索方式,因?yàn)?net自帶的IndexOf默認(rèn)只能找到第一個或最后一個,如果要把全部的匹配項(xiàng)都找出來,還需要自己寫循環(huán)SubString,所以想找下有沒有現(xiàn)成的,就發(fā)現(xiàn)了在這個領(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算法耗時大概是indexof的20%左右。算法確實(shí)有用。

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

相關(guān)文章

  • 在Winform和WPF中注冊全局快捷鍵實(shí)現(xiàn)思路及代碼

    在Winform和WPF中注冊全局快捷鍵實(shí)現(xiàn)思路及代碼

    如果注冊快捷鍵,RegisterHotKey中的fsModifiers參數(shù)為0,即None選項(xiàng),一些安全軟件會警報(bào),可能因?yàn)檫@樣就可以全局監(jiān)聽鍵盤而造成安全問題,感興趣的你可以參考下本文
    2013-02-02
  • c#系列 list詳情

    c#系列 list詳情

    這篇文章主要介紹了c#系列 list,list 本質(zhì)是一個數(shù)組,。就跟我們操作系統(tǒng)一樣,提前申請內(nèi)存大小。所以我們程序一般都有一個申請內(nèi)存,實(shí)際使用內(nèi)存,內(nèi)存碎片這幾個概念,下面?zhèn)z看文章詳細(xì)內(nèi)容吧
    2021-10-10
  • C#中Trim()、TrimStart()、TrimEnd()的用法介紹

    C#中Trim()、TrimStart()、TrimEnd()的用法介紹

    這篇文章主要介紹了C#中Trim()、TrimStart()、TrimEnd()的用法,有需要的朋友可以參考一下
    2014-01-01
  • C#開啟線程的四種方式示例詳解

    C#開啟線程的四種方式示例詳解

    今天小編就為大家分享一篇關(guān)于C#開啟線程的四種方式示例詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#難點(diǎn)逐個擊破(3):params數(shù)組參數(shù)

    C#難點(diǎn)逐個擊破(3):params數(shù)組參數(shù)

    注意,這里的paras全稱是array parameter,也就是數(shù)組參數(shù)。 paras類型參數(shù)主要用于在對數(shù)組長度未知(可變)的情況下進(jìn)行函數(shù)聲明。
    2010-02-02
  • C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例

    C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例

    PowerPoint演示文稿是我們?nèi)粘9ぷ髦谐S玫霓k公軟件之一,本篇文章介紹了C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • C#實(shí)現(xiàn)身份證號碼驗(yàn)證的方法

    C#實(shí)現(xiàn)身份證號碼驗(yàn)證的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)身份證號碼驗(yàn)證的方法,通過封裝的類文件實(shí)例化調(diào)用實(shí)現(xiàn)了對身份證號碼的驗(yàn)證,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • c# 常見文件路徑Api的使用示例

    c# 常見文件路徑Api的使用示例

    c#編程中經(jīng)常有遇到要處理文件路徑的需求,本文分別講述了如何從程序下面的文件和臨時目錄下的文件去使用路徑api,感興趣的朋友可以了解下
    2021-05-05
  • 共享鎖using范圍的實(shí)現(xiàn)方法

    共享鎖using范圍的實(shí)現(xiàn)方法

    共享鎖using范圍的實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-04-04
  • C#訪問C++動態(tài)分配的數(shù)組指針(實(shí)例講解)

    C#訪問C++動態(tài)分配的數(shù)組指針(實(shí)例講解)

    下面小編就為大家分享一篇C#訪問C++動態(tài)分配的數(shù)組指針(實(shí)例講解),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論