如何计算算法的复杂度?

时间:2017-05-24 22:15:10

标签: algorithm time-complexity complexity-theory

我试图计算算法的复杂性,但我不知道该怎么做。我知道如何解决简单算法,但我正在努力进行递归。

有递归代码:

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))));
    }

有人可以解释一下或帮我计算这个功能吗?我试过谷歌搜索但我只能找到简单的例子。(也许我的代码也很简单?)

谢谢!

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];
    }
}

我无法理解第二段代码将会做什么,因为代码中没有提供很多功能。也许你可以解释一下?