为什么此函数的时间复杂度不是O(m!)?

时间:2018-08-20 19:25:05

标签: c function time-complexity big-o complexity-theory

当我尝试查找此函数的时间复杂度时,我附带了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);
}

3 个答案:

答案 0 :(得分:2)

  • 递归终止取决于nif (n <= 1) return;
  • 有2种可能的递归调用: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

  • 如果m> 1,
  • f3(n,m)= f3(n-1,m-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)问题。