当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));
}
答案 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
。