C 求递归函数的时间复杂度
当n1是s1的长度,n2是s2的长度时,为什么这个函数的时间复杂度是O(n1*n2) 我试图建立一个方程式,但失败了C 求递归函数的时间复杂度,c,recursion,time-complexity,C,Recursion,Time Complexity,当n1是s1的长度,n2是s2的长度时,为什么这个函数的时间复杂度是O(n1*n2) 我试图建立一个方程式,但失败了 #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]) ret
#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));
}
#包括
int f(字符*s1,字符*i1,字符*s2,字符i2){
如果(s2[i2]=='\0')
返回1;
如果(s1[i1]=='\0')
返回0;
如果(s1[i1]!=s2[i2])
返回f(s1,i1+1,s2,0);
返回f(s1,i1+1,s2,i2+1);
}
void main(){
printf(“%d”,f(“你好”,0,“他”,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
让a
作为第一个整数索引,其中s1[a]!=s2[a]
∧ <代码>s1[a]!='\0'∧ <代码>s2[a]!='\0'
如果a
存在,则函数为O(n1)
否则,它是O(min{n1,n2})
简单地说,如果一个字符串是另一个字符串的右修剪版本,那么函数将是O(n),n是子字符串的大小 否则,它将是O(n1)
为了理解这一点,我建议您自己尝试函数的一些迭代,先用笔和纸,不使用最后一个
if
函数将两个尾部调用的i1
增量1
,因此时间复杂度为O(n1)
请注意,此函数没有实现strstrstr()的变体,因为它将无法找到与
f(“aab”,0,“ab”,0)
的匹配项。对于两个尾部调用,函数将i1
递增1
,因此时间复杂度为O(n1)
请注意,此函数没有实现strstrstr()的变体,因为它无法找到与
f(“aab”,0,“ab”,0)
的匹配项。至少描述了该函数应该执行的操作。为什么您认为它是n1*n2?它不是O(n1*n2)
调用堆栈只能得到n1-i1
深度,并且没有回溯。@pnina:您可以通过单击其分数下面的灰色复选标记来接受这个答案。至少描述一下该函数应该做什么。为什么您认为它是n1*n2?它不是O(n1*n2)
调用堆栈只能得到n1-i1
深度,并且没有回溯。@pnina:您可以通过单击其分数下面的灰色复选标记来接受此答案。