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的值,最初放在三倍中。听起来对吗/是的,我想你是对的,做得很好。没什么可补充的。