Java 时间复杂度分析

Java 时间复杂度分析,java,performance,time-complexity,Java,Performance,Time Complexity,对不起,我没有时间在这里写长篇大论。这是我目前正在进行的一次实践考试中的一个问题,我知道我所有的大学资源都是离线的。我完全不知道该怎么开始。有人能陪我走过吗?我的数学不是最棒的 考虑以下递归方法: public static int triple(int x) { if (x == 0) return 0; else return add(3, triple(decrement(x))); } 假设减量法的最坏情况时间性能为常数 add方法的第二个参数是线性的,即addx,y的

对不起,我没有时间在这里写长篇大论。这是我目前正在进行的一次实践考试中的一个问题,我知道我所有的大学资源都是离线的。我完全不知道该怎么开始。有人能陪我走过吗?我的数学不是最棒的

考虑以下递归方法:

public static int triple(int x) {
    if (x == 0) return 0;
    else return add(3, triple(decrement(x)));
}
假设减量法的最坏情况时间性能为常数 add方法的第二个参数是线性的,即addx,y的时间 可以用+a表示,对于某些常数b和a,求出最小的大O 以x为单位描述三重方法的最坏情况时间性能。 若要推导此方法的复杂性,请确定并展开 前几个方法会列举问题的大小,然后概括表达式
形成第n种情况的封闭式方程。显示您的工作。

形成一个表,将x值映射到triple方法执行的次数。然后在两者之间形成一种关系

x |  executions |              Executions
-------------------------------------
0  | T(0)                     |  0 A(0)
1  | T(1) + A(3,1) + T(0)     |  3 A(1)
2  | T(2) + + A(3,1) + T(1)   |  6 A(2)
3  | T(3) + A(3,1)            |  9 A(3)

   Time Complexity for T= T(n)+T(n-1)+...+T(n-n)
   Number of add calls is linear O(n)   

   nth term for number of executions
   Un = 3+(n-1)d
      = 3+(n-1)3

   the sum of the an arithmetic series making it O(n^2)

首先,计算给定x递归调用triple的频率。做一张像上面建议的那样的桌子。这将给你一部分广义项

第二,对于每一个triple的执行,最坏情况下的时间复杂度是多少?提示,这由add函数决定

然后概括

对于特定的x,将使用0、1、2、。。。十,。让我们在递归调用i中调用这些参数。当参数为i时,add的第二个参数为3i-1。这意味着这样一个add调用的成本在i中是线性的。因此,每个递归调用在三元组的参数中都是线性的。有x个这样的调用,所以你得到了一个算术级数的和0+3+6+…-这是2倍的时间复杂度

您可以使用以下代码:

public class Test
{
  static int time;
  public static int triple(int x) {
    if (x == 0) return 0;
    else return add(3, triple(decrement(x)));
  }
  private static int add(int i, int j) {
    System.out.println("Spending " + j);
    time += j;
    return i + j;
  }
  private static int decrement(int x) { time++; return x-1; }
  public static void main(String[] args) {
    for (int i = 1; i < 100; i+=10) {
      time = 0;
      System.out.format("triple(%d)=%d; time=%d\n", i, triple(i), time);
    }
  }
}

好的,我最终得出了这个结论,感谢所有的好心人发布答案,让我继续下去,就是采纳Jochen的建议,快速绘制出一张复杂度图,这让一切变得简单多了

首先,请注意,问题规定add是准时的

接下来是一个基本的三重调用层次结构:

n  |  Time complexity:
------------------------------------------
1  | T(1) + (T(0) = 1   )
2  | T(2) + (T(1) = ... )
3  | T(3) + (T(2) = ... )
显然,一种模式正在出现

n  | Time complexity
-------------------------------------------
n  | T(n) + T(n - 1)
所以看来Tn的时间复杂度是n*T,其中T是三重调用的时间复杂度。假设呼叫的增长源来自add,并且add的时间复杂度为On,则时间复杂度变为n*n或On^2

谢谢,伙计们,如果我用错了术语或其他什么,请告诉我


编辑:一些添加已关闭,但仍然是相同的BigO符号。

对不起,我没有时间在这里写一个长而详细的答案。700+代表,您仍然要求我们做您的家庭作业?更准确地说,你正处于最后期限,这并不能免除你在这里的正常指导原则——更不用说不咒骂别人的礼貌了。不要把问题记下来。我正在为你做一个提纲。可能还有其他原因。如果你所在大学的网站在考试前一天晚上关闭了,明天就向负责人投诉。然而,不管你有多紧张-不要在这里开始咒骂-滚开我的屁股。评论清理干净,让我们从现在开始友好。记住,每次执行,你需要确定第二个参数的值,这是下一个三重调用的结果。非常感谢,至少这是一个起点!顺便说一句,我非常确定x必须大于或等于0。对于负数,你会遇到麻烦。是的,我同意,正如你所看到的,在期末考试前一天晚上,我大学的计算机科学系的网站掉了下来,它并不是集合中最锐利的工具。好吧,我得到了时间复杂度,其中n是x的值,最初放在三倍中。听起来对吗/是的,我想你是对的,做得很好。没什么可补充的。