你最好的字符串比较算法是什么?
我找到O(n)
#include <string>
bool str_cpmr(char* str1, char* str2)
{
int l1 = strlen(str1), l2 = strlen(str2) ;
if(l1 != l2)
return false;
for(int i = 0 ; i < l1 ; i++)
if(str1[i] != str2[i])
return false ;
return true ;
}
我想知道是否有其他/更好的解决方案。
另外,如何准确测试?
我建议比较
还有更多测试字符串比较吗?
如何在stl c ++中(slt string :: compare)?
感谢!!!!!
答案 0 :(得分:4)
你的功能是O(n),但仍然需要大约两倍的时间 - strlen
遍历字符串以找到长度,然后(假设它们是相同的长度)你走过字符串再次比较一下这些人物。
而不是那样,我会遍历字符串直到你达到不匹配或两个字符串的结尾。如果达到不匹配,则返回false。当且仅当您到达两个字符串的末尾(同时)而没有任何不匹配时,才返回true。
答案 1 :(得分:3)
逻辑上很难看出如何在小于O(n)的时间内检查字符串中的所有值是否存在单个字符不匹配 - 假设您没有关于该字符串的其他信息。
如果这是一个真正的应用程序并且你对strngs和差异类型有一些了解,你可以通过首先检查每个第N个字符来做得更好,如果你知道它包含长度为'N'的序列,例如部分或电话号。
编辑:注意这仍然是O(n),O()只描述缩放的功率,它只是O(n / N),它仍然是O(n)。如果你将字符串设置为10倍,则检查每个第N个条目的时间仍然是10倍。
答案 2 :(得分:3)
你最好的字符串比较算法是什么?
它仅使用两个源代码字符比较两个字符串:
a==b;
这是一个用C:
写的非smartalec答案bool str_cpmr(char* str1, char* str2)
{
while( *str1 && *str2 && *str1++ == *str2++ )
;
return *str1 == *str2;
}
它恰好是一个循环,所以它显然是O(n),其中n作为较短字符串的长度。此外,它很可能编译为2n内存提取。使用专门的字符串指令可以更快(因此调用strcmp()可能比这更快),但你可能不会在直接C中更快。
答案 3 :(得分:2)
您的改进功能可能如下所示:
bool str_cpmr(char* str1, char* str2)
{
if (NULL == str1 || NULL == str2) return false;
while (*str1 && *str2) {
if (*str1++ != *str2++) {
return false;
}
}
return *str1 || *str2 ? false : true;
}
答案 4 :(得分:2)
如果没有关于字符串性质的附加信息,则没有什么比O(n)更好,其中n是(较短)字符串的长度。
你不能用不到n次的比较!给我一个算法,可以用n-1比较做到这一点。然后在字符串中必须有一个位置,算法无法判断字符是否不同。这样我可以给你一个例子,你的算法与n-1比较失败。
您只能通过常数因素来改善这一点。这还将考虑其他信息,例如如果您知道底层硬件比8位值更快地比较32位值,那么最好比较四个字符的块而不是逐个字符地比较。你不会做得更好。