在ANSI C中搜索字符串内最有效的内存方式是什么? (把代码放好)
需要这样的例子是嵌入式设备,它们的可用内存非常短,但现在有合理的时钟周期。
答案 0 :(得分:9)
这取决于你要找的东西......但是strchr()或strstr()通常是合适的。由于它们不使用额外的内存,因此它们具有极高的内存效率。
答案 1 :(得分:5)
一次前进一个字符是Θ((n-m + 1)m)。检查Boyer-Moore和Knuth-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倍? )并在搜索算法前进时不断将字符流加载到缓冲区。搜索算法必须能够知道如何环绕循环缓冲区(或添加间接级别以隐藏搜索算法中的循环缓冲区)。