strstr竟然把KMP还快!

dir541541 2010-03-22 11:10:00
测试了一下在网页源码中查找关键字,结果发现strstr竟然把KMP快几倍...这是为什么
...全文
1215 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
luyizhou 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mlee79 的回复:]

while(j < strlen(P))
------------------------------------
这句话写的很神奇.....
[/Quote]

这句话大亮!!
JJ8582 2010-03-29
  • 打赏
  • 举报
回复
学习学习
fairywell 2010-03-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lenovo_ 的回复:]
VS2008下调试后发现strstr成了汇编,效率比3GL语言高。

这就是关键答案。
[/Quote]
其实对算法做分析,可以发现在某些情况下(特别是简单的情况下),strstr的时间要比kmp、bm等快,后两者的准备时间太长。比如考虑一个极端的例子,在 abaaaaaaa 中查找 ba,kmp、bm等的准备期都是多余的。
LENOVO_ 2010-03-27
  • 打赏
  • 举报
回复
VS2008下调试后发现strstr成了汇编,效率比3GL语言高。

这就是关键答案。
fairywell 2010-03-27
  • 打赏
  • 举报
回复
kmp的复杂度导致处理小规模问题或者符合某些模式的问题的时候,会比 strstr 慢
即便是更快的 bm 以及其改进算法,在这些情况还是比 strstr 慢。
计算机的速度,很多时候要考虑机器的实际运作情况吧,好比很多情况,快排比冒泡要慢一样
  • 打赏
  • 举报
回复
如何优化,这个要求真的挺高。
除非是真的是底层要求这么高的性能。
否则一般还是不优化吧。

[Quote=引用 14 楼 dir541541 的回复:]
引用 12 楼 gaslinux 的回复:

需要进行优化,不然strstr快一点也不奇怪,我以前写过BM算法的字符串匹配,没优化前strstr快,优化后BM算法快多了。

如何优化?
[/Quote]
gaslinux 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dir541541 的回复:]
引用 12 楼 gaslinux 的回复:

需要进行优化,不然strstr快一点也不奇怪,我以前写过BM算法的字符串匹配,没优化前strstr快,优化后BM算法快多了。

如何优化?
[/Quote]

我那时候是在linux系统里做的一个项目,编译器用的gcc,做了O2级优化,然后编译成汇编语言,再进行汇编级的优化。
绿色夹克衫 2010-03-24
  • 打赏
  • 举报
回复
看LZ的要求似乎是多模式匹配呀,最近问这个问题的人很多,看看Trie或后缀树吧
dir541541 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gaslinux 的回复:]

需要进行优化,不然strstr快一点也不奇怪,我以前写过BM算法的字符串匹配,没优化前strstr快,优化后BM算法快多了。
[/Quote]
如何优化?
FancyMouse 2010-03-22
  • 打赏
  • 举报
回复
kmp只是理论最坏线性。乃网页里是不会遇到什么用aaaaaaaaaab匹配aaaaaaaaaaaaaaaaaaaaaaaaaaaab这种事情的。而且朴素算法更有利于cache hit。
dir541541 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mlee79 的回复:]

还有, 你不会是每次搜索都 kmp_table 吧, 如果是就真杯具了....
[/Quote]
确实是每次都搜索了kmp_table,做了5000次循环得到的时间
看来在这个上费了不少时间
gaslinux 2010-03-22
  • 打赏
  • 举报
回复
需要进行优化,不然strstr快一点也不奇怪,我以前写过BM算法的字符串匹配,没优化前strstr快,优化后BM算法快多了。
mLee79 2010-03-22
  • 打赏
  • 举报
回复
还有, 你不会是每次搜索都 kmp_table 吧, 如果是就真杯具了....
mLee79 2010-03-22
  • 打赏
  • 举报
回复
while(j < strlen(P))
------------------------------------
这句话写的很神奇.....
dir541541 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mlee79 的回复:]
个人觉得LZ在用DEBUG版测试, 或者KMP写的太杯具了。。。偶实测的是大约是 strstr 的两倍左右....
[/Quote]
debug、release两个版本都测过.都是strstr快
KMP是网上找的一个

/**
*KMP-Table
*input: pattern
*output : overlap[]
*/
void kmp_table(const char * P, int * overlap)
{
overlap[0] = -1;
overlap[1] = 0;
unsigned int j = 2;
int cnd = 0;

while(j < strlen(P))
{
if( P[j-1] == P[cnd])
{
overlap[j] = cnd + 1;
++j;
++cnd;
}
else if( cnd > 0)
cnd = overlap[cnd];
else
{
overlap[j] = 0;
++j;
}
}
}

/**
*KMP_Search
*input: char * Target ; char * Pattern:
*output ; the position of the Pattern in Traget;
**/
int kmp_search(const char * T, const char * P)
{
int n = strlen(T);
int m = strlen(P);
int * overlap = new int[m];
int j = 0;

kmp_table(P,overlap);

for( int i = 0; i < n; i++)
{
for(;;)
{
if( T[i] == P[j])
{
j++;
if(j == m)
return i-m + 1;
break;
}
else if(j == 0) break;
else
{
j = overlap[j];
}
}
}
return -1;
}


不知mLee79的KMP代码可否放出来看看.
mLee79 2010-03-22
  • 打赏
  • 举报
回复
个人觉得LZ在用DEBUG版测试, 或者KMP写的太杯具了。。。偶实测的是大约是 strstr 的两倍左右....
dir541541 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xxmix 的回复:]
请问楼主用什么语言?要注意虚拟机效率差异。
[/Quote]
C++
xxMix 2010-03-22
  • 打赏
  • 举报
回复
请问楼主用什么语言?要注意虚拟机效率差异。
绿色夹克衫 2010-03-22
  • 打赏
  • 举报
回复
LZ可以试试Sunday的速度,作为关键字匹配来讲,应该更快。
dir541541 2010-03-22
  • 打赏
  • 举报
回复
也不是特例,是项目中要用到.抓取网页中的些关键,要进行查找操作
所以就找了163主页的源码来做实验,内容也挺多.关键字也换了几组进行实验
结果都是strstr要快

大家可以讨论下各种查找算法的优劣性,比如BM、KMP、MWM之类
项目如果在实际应用中可能数据量会相当大,应该用哪种算法好
加载更多回复(2)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧