a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

c#實現sunday算法實例

2020-01-24 03:11:09
字體:
來源:轉載
供稿:網友

因正則表達式搜索總是出現死循環,開始考慮改為其他搜索方式,因為.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慢很多。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: www久| 狠狠色噜噜狠狠狠狠 | 国产美女在线观看免费 | 欧美手机在线 | 欧美激情 在线 | av中文字幕在线播放 | 欧美一区黄 | www.av在线| www.久久久| 99re视频在线| 欧美成人第一页 | 天天草夜夜草 | 亚洲精品久久久久久久久久久久久 | 91国内 | 男女羞羞视频在线免费观看 | 国产精品久久久久久久免费大片 | 国产伦精品一区二区三区照片91 | 伊人超碰在线 | 久久国产精品99久久久久久老狼 | 18韩国主播福利视频在线观看 | 福利电影在线观看 | 中文字幕综合在线 | 在线 丝袜 欧美 日韩 制服 | 国产精品一区二区久久精品爱微奶 | 欧洲毛片基地 | 国产视频一区二区 | 国产在线a| 999精品一区 | 欧美日韩a | 大尺度cosplay福利裸 | 中文字幕一区二区在线观看 | 国产视频久久久 | 91免费看 | 国内精品一区二区 | theporn国产在线精品 | 国产真实乱全部视频 | 日韩成人一区二区 | 欧美成人三区 | 久久国产精品免费视频 | 日本一区二区视频在线 | 91精品国产一区二区 |