Csharp/C#教程:c#实现sunday算法实例分享

因正则表达式搜索总是出现死循环,开始考虑改为其他搜索方式,因为.net自带的IndexOf默认只能找到第一个或最后一个,如果要把全部的匹配项都找出来,还需要自己写循环SubString,所以想找下有没有现成的,就发现了在这个领域里,BM算法是王道,而sunday算法据说是目前最好的改进版,这一点我没有从国外的网站尤其是wiki上找到印证,但中文谈论sunday的文章很多,我就姑且认为它是最好的吧。
代码如下:
publicstaticintSundaySearch(stringtext,stringpattern)
       {
           inti=0;
           intj=0;
           intm=pattern.Length;

           intmatchPosition=i;

           while(i<text.Length&&j<pattern.Length)
           {
               if(text[i]==pattern[j])
               {
                   i++;
                   j++;
               }
               else
               {
                   if(m==text.Length-1)break;
                   intk=pattern.Length-1;

                   while(k>=0&&text[m]!=pattern[k])
                   {
                       k–;
                   }

                   intgap=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)
           {
               returnmatchPosition;
           }

           return-1;
       }

好了,现在测试下性能:
代码如下:
publicstaticvoidPerformanceTest()
       {
           StreamReaderreader=newStreamReader(“D:\LogConfiguration.xml”,Encoding.ASCII);
           stringcontext=reader.ReadToEnd();
           stringpattern=”xxxx”;
           intcount=1000*10;

           Stopwatchwatch=newStopwatch();

           //watch.Start();
           //for(inti=0;i<count;i++)
           //{
           //   intpos=Sunday.GetPositionFirst(context,pattern,true);
           //}
           //watch.Stop();
           //Console.WriteLine(watch.ElapsedMilliseconds);

           watch.Reset();
           watch.Start();
           for(inti=0;i<count;i++)
           {
               intpos=context.IndexOf(pattern);
           }
           watch.Stop();
           Console.WriteLine(watch.ElapsedMilliseconds);

           watch.Reset();
           watch.Start();
           for(inti=0;i<count;i++)
           {
               intpos=Sunday.SundaySearch(context,pattern);
           }
           watch.Stop();
           Console.WriteLine(watch.ElapsedMilliseconds);
       }

在可以找到匹配与不能找到匹配两种情况下,sunday算法耗时大概是indexof的20%左右。算法确实有用。

但千万不要使用substring来实现算法,那样会新生成很多字符串中间变量,算法带来的好处远远不如分配内存复制字符串的消耗大,注释掉的部分就是使用substring实现的,比indexof慢很多。

您可能感兴趣的文章:解析C#彩色图像灰度化算法的实现代码详解c#中实现图片灰度化技术详解C#实现把彩色图片灰度化代码分享C#灰度化图像的实例代码基于c#图像灰度化、灰度反转、二值化的实现方法详解KMP算法的C#实现方法C#实现排列组合算法完整实例基于私钥加密公钥解密的RSA算法C#实现方法c#冒泡排序算法示例c#哈希算法的实现方法及思路C#计算两个文件的相对目录算法的实例代码C#加密算法汇总(推荐)C#实现协同过滤算法的实例代码C#彩色图片灰度化算法实例

标签: 算法 su c#

C++利用stringstream进行数据类型转换实例

C++循环队列实现模型

上述就是C#学习教程:c#实现sunday算法实例分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/904900.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐