【问题标题】:Analyzing runtime of a short algorithm分析短算法的运行时间
【发布时间】:2016-04-26 04:17:52
【问题描述】:

我得到了以下代码:

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) 应该给出“something^x”还是..? 所以最后我们得到了类似“something^x”+ 2的东西,我怀疑这是对的:/

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

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

【问题讨论】:

  • 由于没有循环,所以运行时间与递归次数成正比。由于只有一个递归步骤hmm(x-1) 并假设x > 0,递归的数量就是x - 1
  • 您确定算法会为输入6 返回42 吗?算法不返回2^x * x!吗?
  • @Codor 如果我是任何法官,它应该返回x² + x。它通过递归计算等差数列的两倍。
  • 我明白了,我看错了。

标签: java algorithm analysis


【解决方案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

如果仔细观察,算法会计算:

2*x + ... + 4 + 2

我们可以反转这个并分解2 并得到

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

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

需要多长时间?

渐近运行时间为O(n)

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

O(n) 是什么意思?

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

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

【讨论】:

  • 哇非常感谢您提供如此详细而准确的回复,非常感谢! :) 我明白了!但是也感谢在我的帖子中回复的其他人:D
【解决方案2】:

函数计算

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多