计算这个字符串匹配函数的big-O复杂度?

时间:2012-02-01 21:56:15

标签: c++ algorithm complexity-theory big-o

任何人都可以帮我计算以下的复杂程度吗? 我已经为家庭作业写了一个strStr函数,虽然它不是我作业的一部分,但我想弄清楚它的复杂性。

基本上它需要一个字符串,找到第一次出现的子串,返回它的索引,
我相信它是O(n),因为虽然它最多只是双循环,但它只会运行n次,其中n是s1的长度,我是否正确?

int strStr( char s1[] , char s2[] ){
    int haystackInd, needleInd;
    bool found = false;
    needleInd = haystackInd = 0;

    while ((s1[haystackInd] != '\0') && (!found)){
        while ( (s1[haystackInd] == s2[needleInd]) && (s2[needleInd] != '\0') ){
            needleInd++;
            haystackInd++;
        }
        if (s2[needleInd] == '\0'){
            found = true;
        }else{
            if (needleInd != 0){
                needleInd = 0;

            }
            else{
                haystackInd++;
            }
        }
    }

    if (found){
        return haystackInd - needleInd;
    }
    else{
        return -1;
    }
}

3 个答案:

答案 0 :(得分:3)

确实是O(n),但它也没有正常运作。考虑在“nanand”中找到“nand”

虽然有问题的O(n)解决方案。

答案 1 :(得分:2)

实际上,外循环可以运行2n次(每次迭代递增haystackInd至少一次或者它将needleInd设置为0,但是在2次连续迭代中从不将needleInd设置为0),但是你最终会得到相同的O(n )复杂性。

答案 2 :(得分:0)

您的算法不正确。您的解决方案中的索引haystackInd不正确。但基于错误算法的结论是正确的。它是O(n),但只是找不到第一次出现的子串。最简单的解决方案与您的相似,将字符串S2与从S1 [0],S1 [1]开始的子串进行比较,......运行时间为O(n ^ 2)。如果你想要O(n)一个,你应该检查KMP算法作为上面提到的templatetypedef。