c - C 中的 strcmp 性能

标签 c string algorithm data-structures

int myStrCmp (const char *s1, const char *s2) {
    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    while (*p1 != '\0') {
       if (*p2 == '\0') return  1;
       if (*p2 > *p1)   return -1;
       if (*p1 > *p2)   return  1;

       p1++;
       p2++;
     }

     if (*p2 != '\0') return -1;

        return 0;
}

这个比较是否有精确的符号 O(n)?当用 s1="abcd"s2="abcd."的两个字符串测量时。对于第一种情况和 s1="asdsdcvv" s2="asdsdcvv"。对于第二种情况,第二种情况是否恰好是第一种情况的两倍?

最佳答案

是的,这是在平均和最坏情况下的 O(n),其中 n 是两个给定字符串中较短的一个的长度。您也可以将其表示为 O(min(m,n)),其中 m 和 n 分别是两个字符串的长度。

但不,O(n) doesn't mean that it needs exactly linear time .这意味着从最小问题规模开始,所有更大的问题都将低于某个线性函数。

如果您想了解更多细节,您需要一个非常详细的机器模型,这对于现代机器(缓存、分支预测、流水线、超线程等)来说似乎是不可能的。和操作系统(除非您使用的是没有多任务处理的非常简单的操作系统)。

关于c - C 中的 strcmp 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30863281/

相关文章:

c - libusb_claim_interface 在 Mac OS X Mountain Lion 上失败

c++ - 将系统命令的输出存储到 c 中的本地字符数组中

c++ - 连接两个变量和LCD打印

python - 使用 Levenshtein 距离作为 Python 中的启发式算法生成字符串的爬山算法?

c# - 在 c# 中拆分/循环包含括号的行

优化带有冷却时间的 Action 顺序的算法

将指针更改为指向堆栈地址而不是堆地址

c - char *derp[20] 是什么意思?

ruby - 如何在一行代码中将 Ruby 中的字符串拆分为两个变量?

algorithm - 一个范围内连接的城市数量