分析短算法的运行时

时间:2016-04-25 19:48:28

标签: java algorithm analysis

我得到了以下代码:

public class alg 
{
    public static int hmm (int x)
    {
        if (x == 1)
        {
            return 2;
        }
        return 2*x + hmm(x-1);
    }

    public static void main (String[] args)
    {
        int x = Integer.parseInt(args[0]);
        System.out.println(hmm(x));
    }
}

所以第一个问题是,这个算法算什么? 我刚刚在eclipse中输入并运行它 所以我可以更好地看到它的作用(以前它是伪代码,我不能在这里键入它所以我输入了代码)。我已经意识到这个算法确实遵循:它将输入并乘以它的后续数字。 例如:

input = 3, output = 12 because 3*4 = 12.  
Or Input = 6, output 42 because 6*7 = 42.

好的,下一个问题是我的问题。我要求分析这个算法的运行时间,但我不知道从哪里开始。 我会说,在开始时,当我们定义x时,我们已经得到了time = 1 我相信if循环也给time = 1。 最后一部分,return 2x + alg(x-1)应该给出" ^ x"要么..? 所以最后我们得到了类似的东西^ x" + 2,我对此表示怀疑:/

编辑,设法输入伪代码:)

Input: Integer x with x > 1
if x = 1 then
  return 2;
end if
return 2x + hmm(x-1);

2 个答案:

答案 0 :(得分:1)

如果遇到问题,请尝试使用(小)数字来浏览代码。

这是什么计算的?

我们以hmm(3)为例:

  1. 3 != 1,因此我们计算2 * 3 + hmm(3-1)。降低递归级别。
  2. 2 != 1,因此我们计算2 * 2 + hmm(2-1)。降低递归级别。
  3. 1 == 1,所以我们返回2。不再递归,因此hmm(2-1) == hmm(1) == 2
  4. 备份一个递归级别,我们得到2 * 2 + hmm(1) = 2 * 2 + 2 = 4 + 2 = 6。因此hmm(2) = 6
  5. 另一个级别备份,我们得到2 * 3 + hmm(2) = 6 + 6 = 12
  6. 仔细观察,算法计算:

    2*x + ... + 4 + 2

    我们可以撤消此问题并将2分解并获取

    2 * (1 + 2 + ... + x)

    这是一个arithmetic progression,我们有一个众所周知的公式(即x² + x

    需要多长时间?

    渐近运行时间为O(n)

    没有循环,所以我们只需要计算递归次数。人们可能很想计算各个计算步骤,但是每个步骤都是常数,所以我们通常将它们组合成一个常数因子k

    O(n)的含义是什么?

    嗯...我们进行x - 1递归步骤,在每个步骤中x减少1,直到我们达到x == 1。从x = nx = 1,有n - 1个此类步骤。因此,我们需要k * (n - 1)次操作。

    如果您认为n非常大,- 1变得可以忽略不计,那么我们放弃它。我们也放弃了常数因子,因为对于大nO(nk)O(n)也没有那么大的不同。

答案 1 :(得分:0)

该函数计算

f(x) = 2(x + x-1 + x-2 + ... + 1)

它将在O(x)中运行,即x次将被调用恒定时间O(1)