C++ c++;字符串比较算法

C++ c++;字符串比较算法,c++,string,algorithm,stl,compare,C++,String,Algorithm,Stl,Compare,您最好的字符串比较算法是什么 我发现O(n) #包括 bool str_cpmr(字符*str1,字符*str2) { int l1=strlen(str1),l2=strlen(str2); 如果(l1!=l2) 返回false; 对于(int i=0;i 谢谢 从逻辑上讲,如果没有关于字符串的其他信息,就很难在不到O(n)的时间内检查字符串中的所有值是否存在单个字符不匹配 如果这是一个真实的应用程序,并且您对strngs和差异类型有一定的了解,那么如果您知道它包含长度为'N'的序列,例如部件

您最好的字符串比较算法是什么

我发现O(n)

#包括
bool str_cpmr(字符*str1,字符*str2)
{
int l1=strlen(str1),l2=strlen(str2);
如果(l1!=l2)
返回false;
对于(int i=0;i
我想知道是否有其他/更好的解决方案

还有,如何准确地测试这一点

我提议比较一下

  • 100根火柴
  • 100个字符串不同于一个字符交换
还有更多的测试字符串需要比较吗

如何在STL C++中(SLT String::比较)?< /P>


谢谢

从逻辑上讲,如果没有关于字符串的其他信息,就很难在不到O(n)的时间内检查字符串中的所有值是否存在单个字符不匹配

如果这是一个真实的应用程序,并且您对strngs和差异类型有一定的了解,那么如果您知道它包含长度为'N'的序列,例如部件或电话号码,那么您可以先检查每个第N个字符,平均做得更好

编辑:注意这仍然是O(n),O()只描述了缩放的能力,它只是O(n/n),仍然是O(n)。如果将字符串延长10倍,则每n个条目检查一次仍然需要10倍的时间。

您的函数是O(n),但仍然需要大约两倍的时间--
strlen
遍历字符串以查找长度,然后(假设它们的长度相同)再次遍历字符串,比较字符

相反,我将遍历字符串,直到找到不匹配的字符串或两个字符串的末尾。如果达到不匹配,则返回false。当且仅当(同时)到达两个字符串的末尾且没有任何不匹配的情况下,才返回true

您最好的字符串比较算法是什么

它仅使用源代码的两个字符比较两个字符串:

a==b;

以下是一个非smartalec的答案,用C编写:

bool str_cpmr(char* str1, char* str2)
{
  while( *str1 && *str2 && *str1++ == *str2++ )
    ;
  return *str1 == *str2;
}

它正好是一个循环,所以它显然是O(n),其中n是较短字符串的长度。此外,它可能编译为2n次内存获取。使用专门的字符串指令可以更快(因此调用strcmp()可能会比这更快),但在C语言中可能不会更快。改进后的函数可能如下所示:

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;
}

如果没有关于字符串性质的附加信息,那么没有什么比O(n)更好的了,其中n是(较短)字符串的长度

您不能使用少于n个比较!给我一个算法,可以做n-1比较。然后字符串中必须有一个位置,算法无法判断字符是否不同。这样,我可以给你一个例子,你的算法与n-1比较失败


您只能通过一个恒定的因子来改善这一点。这还将考虑其他信息,例如,如果您知道底层硬件比较32位值比比较8位值快,那么最好比较四个字符的块,而不是逐个字符进行比较。你不会做得更好。

(被C++标签混淆)可能是错误的,但不是有代码> STD::String::比较< /代码>吗?您是否仅为strlen包含
?使用
std::string
s!比较长度似乎是一种浪费,因为for循环只需检查EOS。为什么不使用2个
std::string
对象,然后执行
s1==s2
,而不是重新设计轮子。您不需要
strlen
。这是重复的工作。@tenfour:这仍然是O(n),它只是有一个更高的常数乘数。+1:当然,但在这之前,你还可以做一件事:在开始遍历之前比较传入的指针。如果它们是相同的地址,则跳过所有内容,只返回true。@WhozCraig,如果真的有可能将字符串与自身进行比较,这将节省时间;但在我写过的代码和我看过的代码中,即使可能性很低,像这样的预检查也是净损失。例如,如果您测试1000个10个字符的字符串,其中1个字符与它本身进行比较,您将节省大约9个操作,浪费大约999个操作,而净浪费990个操作。@JerryCoffin关于字符串结尾:您如何测试字符串结尾?tks@我完全同意概率权重。因此,这样的先决条件检查非常专业化。如果被编码的特定算法被设计为可能两次传递同一个指针,那么这是一个胜利,否则很可能不是,cmp指令将是一个净操作损失。当然,它仍然是O(1)+O(n),因此O(n)。如果这个额外的cmp是相关的,那么您应该首先在asm中编写它。@madptr:一个包含
'\0'
的字节表示字符串的结尾。您可以做得更好:for(;*str1==*str2&&*str1;+str1,+str2;){}return*str1=*str2;//每个循环只进行两次比较,而不是三次。
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;
}