【发布时间】:2016-05-07 23:57:19
【问题描述】:
作为高性能计算课程的一部分,我正在尝试尽可能加快 C 语言中的简单字符串搜索,我想知道是否有任何我错过的明显可以做的事情我当前的迭代,或者是否有更好的方向。
一些限制是模式必须从左到右搜索,每个字符必须单独检查,并且需要基于for循环。
到目前为止,我已经将 999 的模式所花费的时间减少了 9,999,999 的文本中的 B 后跟 B 从 ~18 秒到 ~9 秒,但我不确定它是否可以考虑到上述限制,速度会更快。
目前的代码是:
int match(char** text, int n, char** pattern, int m){
int i, j, last = n-m;
for(i = 0; i <= last; i++){
for(j = 0; j < m; j++){
if((*text)[i+j] != (*pattern)[j]){
break;
}
}
if(j == m){
return i;
}
}
return -1;
}
其中text是要搜索的文本,pattern是要搜索的模式,n是文本的长度,m是模式的长度。
编辑:这是朴素字符串搜索算法的实现。 https://en.wikipedia.org/wiki/String_searching_algorithm#Na.C3.AFve_string_search
编辑 2:@RadLexus 想法后的代码从 char** 更改为 char*(快 25%):
int match(char* text, int n, char* pattern, int m){
int i, j, last = n-m;
for(i = 0; i <= last; i++){
for(j = 0; j < m; j++){
if(text[i+j] != pattern[j]){
break;
}
}
if(j == m){
return i;
}
}
return -1;
}
【问题讨论】:
-
我不确定我是否理解你的任务,但你可以使用
if((*text)[i+j] != (*pattern)[j]){ i = i+j; break; }来避免不必要的迭代 -
@RadLexus 可能是为了确保我们坚持简单的字符串搜索,而不是使用 Boyer-Moore 或 KMP。
-
嗯。原型是给你的吗?我想知道双重间接是否会减慢速度,尤其是。在紧密的循环内。对于简单的字符串,一个
char *就足够了。 -
将
last声明为常量。const int last = n-m;可能暗示编译器在循环的每次迭代中将last保存在寄存器中。 -
是关于模式 AAAA...B 还是关于任意模式的问题?
标签: c string optimization pattern-matching