【发布时间】:2014-12-31 20:22:28
【问题描述】:
private static int Sum (int[] a, int from, int to){
int total=0;
for (int i=from; i <= to; i++)
res += a[i];
return total;
}
public static int Method3 (int []a){
int temp=0;
for (int i=0; i <= a.length; i++)
{
for (int j=0; j <= a.length; j++)
{
int c = Sum(a,i,j);
if (c%3 == 0)
{
if (j-i+1 > temp)
temp = j-i+1;
}
}
}
return temp;
}
Method3 方法的目的是找到给定数组 numbers' 的最长组合,以便组合的数字之和可以除以 3 而没有余数。 我现在想弄清楚 Method3 方法的时间和内存复杂度,然后我的目的是学习如何最大限度地改进它。
我的假设是: Method3 中的前两个循环导致 O(n^2) 的时间复杂度,因为它是重复的 (n + (n-1) + ... +1) 次,等于 [n(n+1)]/2 => (1/2)n^2+(1/2)n => O (n^2)。 但是,我们也有 Sum 方法,它嵌套在 Method3 的两个循环中,它的最坏情况复杂度只能是 O(n) - 因为它是 i 和 j 之间可能存在的最大差距(或也就是说) 因此,我认为 Method3 的最终时间复杂度为:n^2 * n = n^3。那正确吗? 现在,关于内存复杂性,我真的很困惑。我的假设是 O(1),因为这个程序中只有整数变量,它保存一个字段。
现在下一个问题,我如何提高效率?我什至如何处理这样的事情?最后,我怎么知道我所达到的复杂性是最好的?
谢谢!
【问题讨论】:
-
这是题外话,因为它属于 codereview.stackexchange.com
-
这个问题似乎离题了,因为它是关于改进工作代码的。
-
对不起。但是我至少可以在计算复杂性方面获得帮助吗?我不确定我的回答是否正确。我怀疑这是事实......谢谢。
-
这不会引发 IndexOutOfBoundsException?
-
我可以向您推荐这个精彩的算法设计和分析世界简介:coursera.org/course/algo