当我尝试查找此函数的时间复杂度时,我附带了m!
。
我所做的是
T(n,m)=m*T(n-1,m-1)=m(m-1)T(n-2,m-2)=....=m!T(1,1)
但是时间复杂度的答案是O(n)
。为什么?
void f3 (int n, int m)
{
if (n <= 1)
return;
if (m > 1)
return m*f3(n-1, m-1);
f3(n-1, m);
}
答案 0 :(得分:2)
n
:if (n <= 1) return;
m*f3(n-1, m-1)
或f3(n-1, m)
。 (一个或另一个)每次调用后,自变量n
都会减少。结果,最多将有n
个对函数f3
的调用。
函数f3
的其余部分的时间复杂度是恒定的。这样,总时间复杂度为O(n)
。
我建议您在函数的开头添加一个printf
语句以打印所有呼叫。这将帮助您了解正在发生的事情。
答案 1 :(得分:2)
该函数递减 n 并再次调用它自己,因此具有O(1)
的函数 f 的 N 调用复杂,所以NO(1)=O(N)
。您的错误是将 m f(n-1,m-1)*视为函数 F 的 M 调用。
答案 2 :(得分:1)
返回值不能说明函数的复杂性。 复杂度表明运行代码将需要多少步骤。
注意
f3(n,m)= 0如果n <= 0
f3(n,m)= f3(n-1,m-1)
f3(n,m)= f3(n-1,m)
f3(n,m)= 0否则
在第一种情况下,解决方案需要一步完成。
在第二种情况下,根据m的值,问题被转换为第一种情况或第三种情况,然后转换为第一种情况。但是,这将始终在O(n)中发生。如果m大于O(n)到第一种情况,则O(n)直到n变为1。
在第三种情况下,问题将在O(n)中转换为第一种情况。
O(1)中的第四种情况。
因此,问题是一个O(n)问题。