用于在C中的字符串内搜索的大多数内存有效方式

时间:2008-10-17 19:24:43

标签: c performance algorithm

在ANSI C中搜索字符串内最有效的内存方式是什么? (把代码放好)

需要这样的例子是嵌入式设备,它们的可用内存非常短,但现在有合理的时钟周期。

7 个答案:

答案 0 :(得分:9)

这取决于你要找的东西......但是strchr()或strstr()通常是合适的。由于它们不使用额外的内存,因此它们具有极高的内存效率。

答案 1 :(得分:5)

一次前进一个字符是Θ((n-m + 1)m)。检查Boyer-MooreKnuth-Morris-Pratt算法,以获得更有效的搜索子串的方法 - 两者都低至O(n)。你方便的算法教科书应该讨论它们。标准的C库strstr函数实现了一个或两个,所以使用它而不是自己滚动。

答案 2 :(得分:4)

我认为这取决于你要搜索的内容,但线性搜索/比较使用的内存不会超过两个字符串('host'和'token')。例如:

char host[] = "this is my string to search";
char token[] = "y st";
int k = 0;
while(host[k] != '\0'){
  for(int t=0; (token[t]!='\0' && host[k+t]!='\0');){
    if(host[k] == token[t]){
      t++;  // we matched the first char of token, so advance
    }
    else{   // no match yet, reset the token counter and move along the host string
      k++;
      t = 0;
    }
  }
  k++;
}

(我可能会稍微偏离实施,但希望你能得到我的想法。)

像strstr这样的库函数也值得一看。

答案 3 :(得分:2)

如果您正在寻找子字符串,那么strstr非常有效。而对于char,strchr也非常有效。既不需要额外的存储空间。

我不确定你还有什么需要的。

答案 4 :(得分:1)

根据搜索类型和边界条件,有大量不同的算法用于搜索字符串中的子字符串。此处提供了大集合http://www-igm.univ-mlv.fr/~lecroq/string/index.html

答案 5 :(得分:1)

Karp Rabin只使用了四个整数并且具有线性平均时间。它只计算搜索字符串的哈希值,并使用一些数学技巧快速获取下一个子字符串的哈希值,给定它之前的子字符串的哈希值。

标准版本遇到麻烦,因为大多数语言都没有真正的数学模,但Gonnet和Baeza-Yate的数据结构和算法手册version,它使用字大小作为隐式模(它也更快)。

答案 6 :(得分:0)

我最近遇到过这个问题,只是想分享一下我的想法。

“记忆效率”,因为我解释它是能够在仅给出N量可用存储器的情况下搜索大小为M的长串,M> 1。 N.这是在搜索字符串中有效使用每个字符的内存的替代方法。我觉得可能与原始海报的嵌入式环境(可能有大量存储空间)更相关。

无论你使用哪种算法进行比较(当然效果越好),我会选择使用循环缓冲区(它应该大于你要搜索的字符串,或许至少2倍? )并在搜索算法前进时不断将字符流加载到缓冲区。搜索算法必须能够知道如何环绕循环缓冲区(或添加间接级别以隐藏搜索算法中的循环缓冲区)。