c#实现sunday算法实例
Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符,下面小编为大家整理了c#实现sunday算法实例,希望能帮到大家!
因正则表达式搜索总是出现死循环,开始考虑改为其他搜索方式,因为自带的IndexOf默认只能找到第一个或最后一个,如果要把全部的匹配项都找出来,还需要自己写循环SubString,所以想找下有没有现成的,就发现了在这个领域里,BM算法是王道,而sunday算法据说是目前最好的改进版,这一点我没有从国外的网站尤其是wiki上找到印证,但中文谈论sunday的文章很多,我就姑且认为它是最好的`吧。
复制代码 代码如下:
public static int SundaySearch(string text, string pattern)
{
int i = 0;
int j = 0;
int m = th ;
int matchPosition = i;
while (i < th && j < th)
{
if (text[i] == pattern[j])
{
i++;
j++;
}
else
{
if(m==th-1)break;
int k = th - 1;
while (k >= 0 && text[m ] != pattern[k])
{
k--;
}
int gap = th - k;
i += gap;
m = i + th;
if (m > th) m = th - 1;
matchPosition = i;
j = 0;
}
}
if (i <= th)
{
return matchPosition;
}
return -1;
}
好了,现在测试下性能:
复制代码 代码如下:
public static void PerformanceTest()
{
StreamReader reader = new StreamReader("D:", I);
string context = ToEnd();
string pattern = "xxxx";
int count = 1000*10;
Stopwatch watch=new Stopwatch();
//t();
//for (int i = 0; i < count; i++)
//{
// int pos= ositionFirst(context, pattern, true);
//}
//();
//eLine(sedMilliseconds);
t();
t();
for (int i = 0; i < count; i++)
{
int pos = xOf(pattern);
}
();
eLine(sedMilliseconds);
t();
t();
for (int i = 0; i < count; i++)
{
int pos = aySearch(context, pattern);
}
();
eLine(sedMilliseconds);
}
在可以找到匹配与不能找到匹配两种情况下,sunday算法耗时大概是indexof的20%左右。算法确实有用。
但千万不要使用substring来实现算法,那样会新生成很多字符串中间变量,算法带来的好处远远不如分配内存复制字符串的消耗大,注释掉的部分就是使用substring实现的,比indexof慢很多。
-
C与C++之间相互调用的实例方法
如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用__cplusplus预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。下面是小编为大家...
-
C语言的第一个程序
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的`编程语言。下面小编带大家看看第一个C语言程序。第一个C语言程序实例说明输出"Hello,world!"是...
-
2017全国计算机二级《C语言》考试题及答案
在备考复习阶段,需通过大量试题练习,加深对考点的理解和掌握。以下是本站小编搜索整理的一份全国计算机二级《C语言》考试题及答案,供参考练习,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!一、选择题1).我们所写的每条C语句,经过编译最...
-
C++ cin输入流详解
标准输入流是从标准输入设备(键盘)流向程序的数据。在头文件iostream.h中定义了cin、cout、cerr、clog4个流对象,cin是输入流,cout、cerr、clog是输出流。下面是小编为大家整理的C++cin输入流详解,欢迎参考~cin是istream类的对象,它从标准输入设备(键盘)获取数据,程...
相关文章
- Unit5 Why do you like pandas Section B 第一课
- 关于Applying For A Student Discount Card的留学英语口语
- 中学生英语作文:Cure Sadness with Company
- 英语报纸解读:Data may disrupt a peculiar business
- Chinas Liu to seek injury advice in US soon英语作文
- Java中synchronized的使用实例
- 冀教版三年级上册《Aunts, Uncles and Cousins》教学设计
- 英语报纸解读:Data may disrupt a peculiar business大纲
- 英语美文:Olympic Fund Scratchcard Launched
- Academic Dishonesty on Campus英语作文