找出递归函数的时间复杂度

时间:2017-07-05 16:03:43

标签: c recursion time-complexity

当n1是s1的长度时,为什么这个函数的时间复杂度为O(n1 * n2),而n2是s2的长度?

我试图建立一个方程但失败了。

#include <stdio.h>

int f(char* s1, int i1, char* s2, int i2) {
    if (s2[i2] == '\0')
        return 1;
    if (s1[i1] == '\0')
        return 0;
    if (s1[i1] != s2[i2])
        return f(s1, i1 + 1, s2, 0);
    return f(s1, i1+1, s2, i2+1);
}

void main() {
    printf("%d", f("hello", 0, "he", 0));
}

2 个答案:

答案 0 :(得分:2)

对于两个尾调用,函数将i1增加1,因此时间复杂度为 O(n1)

请注意,此功能未实现strstr()的变体,因为它无法找到f("aab", 0, "ab", 0)的匹配项。

答案 1 :(得分:0)

a成为s1[a] != s2[a]s1[a] != '\0's2[a] != '\0'

的第一个整数索引

如果a存在,那么您的功能是 O(n1)

否则,它是 O(min {n1,n2})

简单来说,如果你的一个字符串是另一个字符串的右边修剪版本,那么函数将是O(n),其中n是子字符串的大小。

否则,它将是O(n1)。

为了理解这一点,我建议你自己尝试使用钢笔和纸张对函数进行一些迭代,最初没有最后if