我试图计算算法的复杂性,但我不知道该怎么做。我知道如何解决简单算法,但我正在努力进行递归。
有递归代码:
static int F(int m, int n)
{
if (n == 0)
return m;
if (m == 0 && n > 0)
return n;
else
return Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m, n - 1)), (D(m - 1, n - 1) + F(m - 1, n - 1))));
}
有人可以解释一下或帮我计算这个功能吗?我试过谷歌搜索但我只能找到简单的例子。(也许我的代码也很简单?)
谢谢!
答案 0 :(得分:2)
我不知道你的第一段代码中的 D 功能是什么。我将其视为一个不变的函数。
您的第一段代码等同于以下代码。
static int F(int m, int n)
{
if (n == 0 || m == 0)
return n + m;
else
return Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m, n - 1)), (D(m - 1, n - 1) + F(m - 1, n - 1))));
}
使用两个参数计算递归函数的时间复杂度有点困难,但我们可以粗略估计它。我们有以下等式。
T(n, m) = T(n-1, m) + T(n, m-1) + T(n-1, m-1)
我们可以发现方程与binomial coefficient的递归方程非常相似,但结果更大。这告诉我们算法的时间复杂度是指数函数,这很慢。
但实际上,您可以使用一些技巧将其时间复杂度降低到O(mn)。
bool calculated[MAX_M][MAX_N];
int answer[MAX_M][MAX_N]
static int F(int m, int n)
{
if (n == 0 || m == 0)
return n + m;
else
{
if (calculated[m][n] == false)
{
answer[m][n] = Math.Min((1 + F(m - 1, n)), Math.Min((1 + F(m, n - 1)), (D(m - 1, n - 1) + F(m - 1, n - 1))));
calculated[m][n] = true;
}
return answer[m][n];
}
}
我无法理解第二段代码将会做什么,因为代码中没有提供很多功能。也许你可以解释一下?