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

C++ 计算这个字符串匹配函数的big-O复杂性?,c++,algorithm,complexity-theory,big-o,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

有人能帮我计算一下以下问题的复杂性吗?
我已经为家庭作业编写了一个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;
    }
}

实际上,外循环可以运行2n次(每次迭代至少增加一次,或者它将needleInd设置为0,但在连续两次迭代中从未将needleInd设置为0),但最终的O(n)复杂度相同。

实际上,外循环可以运行2n次(每次迭代至少增加一次HyasACKAND或将针线设置为0,但在2次迭代中从未将针尖设置为0),但最终达到相同的O(n)复杂度。

< P>它确实是O(n),但它也不能正常工作。考虑在“NAND”中找到“NAND”< /P>

有一个O(n)解,但

它确实是O(n),但它也不能正常工作。考虑在“南德”< /P>中找到“NAND”。


不过,这个问题有一个O(n)解决方案。

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

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

您的意思是“大O复杂度”吗独立于运行时,此代码不正确。请尝试在字符串“cococoa”中搜索“cocoa”。您可能需要查看KMP算法,它是对上述算法的修改,用于处理“cocoa”之类的情况,其中失败可能表示部分匹配。是的,抱歉,英语不是我的母语:)哪个参数是主字符串,哪个是搜索字符串?请更清楚地说出你的论点;-)@卡梅隆:既然
haystackInd
用于
s1
needleInd
用于
s2
,我假设s1是主字符串(haystack),s2是搜索字符串(needle)。你的意思是独立于运行时的“大O复杂性”,这段代码是不正确的。尝试在字符串“cococoa”中搜索“cocoa”。您可能想查看KMP算法,它是对上述算法的修改,用于处理“cocoa”之类的情况,其中失败可能表示部分匹配。是的,对不起,英语不是我的母语:)哪个参数是主字符串,哪个是搜索字符串?请更清楚地说出你的论点;-)@卡梅隆:由于
haystackInd
用于
s1
needleInd
用于
s2
,我假设s1是主字符串(haystack),s2是搜索字符串(needle)。如果N是s1的长度,每次迭代都会进行比较,搜索失败,并且needleInd至少重置一次,将进行>N次比较,但不超过2N.@R.MartinhoFernandes-在每次迭代中,进行比较,要么(1)两个索引都提前,要么(2)发生故障并重置指针,或者(3)发生故障并碰撞草堆指针。如果(2)后跟(3),则可以将haystack字符串中的同一字符与两个不同的字符进行比较,而不是仅与一个字符进行比较。如果N是s1的长度,则每次迭代都会进行比较,搜索失败,并且至少重置一次needleInd,每次迭代都会进行>N次比较,但不超过2N。@R.MartinhoFernandes,进行比较后,(1)两个索引都提前,或(2)发生故障并重置指针,或(3)发生故障并碰撞草堆指针。如果(2)后跟(3),则可以将haystack字符串中的同一个字符与两个不同的字符进行比较,而不仅仅是一个字符。