Java 一种短算法的运行时间分析

Java 一种短算法的运行时间分析,java,algorithm,analysis,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.parseI

我得到了以下代码:

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
。 最后一部分,
返回2x+alg(x-1)
应该给出“某物^x”或。。? 所以最后我们得到了类似于“something^x”+2的东西,我怀疑这是对的:/

编辑,也设法键入伪代码:)


该函数计算

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

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

当您遇到问题时,尝试使用(小)数字遍历代码

这算什么?

让我们以
hmm(3)
为例:

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

    2*x+…+4+2

    我们可以把这一点颠倒过来,把
    2
    因子去掉,得到

    2*(1+2+…+x)

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

    需要多长时间?

    渐近运行时间为
    O(n)

    没有循环,所以我们只需要计算递归的数量。人们可能会试图计算各个计算步骤,但每个步骤的a都是常数,因此我们通常将它们组合成常数因子
    k

    O(n)是什么意思?

    嗯。。。我们进行
    x-1
    递归步骤,在每个步骤中通过
    1
    减少
    x
    ,直到我们达到
    x==1
    。从
    x=n
    x=1
    n-1
    这样的步骤。因此,我们需要
    k*(n-1)
    操作


    如果你认为
    n
    非常大,
    -1
    可以忽略不计,所以我们放弃它。我们还降低了常数因子,因为对于大的
    n
    O(nk)
    O(n)
    也没有太大区别。

    因为没有循环,所以运行时间与递归次数成正比。由于只有一个递归步骤
    hmm(x-1)
    ,并且假设
    x>0
    ,递归的数量就是
    x-1
    。您确定算法对输入
    6
    返回
    42
    ?算法不返回
    2^x*x
    ?@Codor如果我是法官,它应该返回
    x²+x
    。它计算算术级数的两倍。。。通过递归。我明白了,我误解了。你所说的“将被调用为常数时间
    O(1)
    ”到底是什么意思?这意味着有恒定的计算量,而不依赖于x值。这是大O表示法的一个例子:。哇,非常感谢您的详细和准确的回答,非常感谢!)我明白了!但也要感谢其他人在我的帖子中回复:D
    f(x) = 2(x + x-1 + x-2 + ... + 1)