计算字符串出现次数的最快方法

时间:2012-05-12 10:25:48

标签: c string performance

我想知道在另一个字符串(haystack)中计算字符串(针)出现次数的最快方法是什么。我这样做的方式是:

int findWord(char * file, char * word){
 char *fptr;
 char * current = strtok_r(file, " ,.\n", &fptr);
 int sum = 0;
 while (current != NULL){
    //printf("%s\n", current);
    if(strcmp(current, word) == 0)
        sum+=1;
    current = strtok_r(NULL, " ,.\n", &fptr);
 }
 return sum;
}

使用更复杂的算法(Boyer-Moore)会更快吗? 感谢

3 个答案:

答案 0 :(得分:2)

目前,如果您的计划正在计算单词"blah"并且遇到令牌"blahblah",则您的算法将其计为零次。如果需要将其计为两个,那么 cound 将从更高级的方法中受益。

如果你的程序符合你的要求,你就会尽可能快地进行处理:它已经是字符长度和字数的线性关系,所以你无法进一步加速它。 / p>

需要一个更有趣的解决方案来计算具有自混叠的单词:例如,在"aa"字符串内计算"aaaa" s。如果您需要在这种情况下返回3,则需要更多高级算法。

答案 1 :(得分:1)

  

使用更复杂的算法(Boyer-Moore)会更快吗?

在您的算法中,比较单位是单词而不是字符。这使算法能够忽略跨越单词边界的匹配,从而使其在O(n)时间内运行。

我怀疑你是否能够渐渐地击败它。

就降低乘法常数而言,现在你的算法会在file中查看每个字符两次。你可以通过重写代码来消除冗余,使用一对指针和一个for循环(弄清楚细节留给读者练习:))

答案 2 :(得分:0)

除非你的系统对字符串函数的执行不好,否则这应该是最快的:

const char *s, *t;
size_t cnt;
for (cnt=0, s=haystack; t=strchr(s, needle); s=t+1, cnt++);

如果你不想计算重叠的匹配数,请稍微调整一下(+ strlen(针)而不是+1)。