【问题标题】:Calculating and improving time & memory complexity (Java)计算和改进时间和内存复杂度 (Java)
【发布时间】: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

标签: java complexity-theory


【解决方案1】:

是的,时间复杂度是 O(n^3)。 是的,空间复杂度是 O(1)。唯一使用的空间是恒定数量的索引。

使您的算法更高效并缩短比较次数的一种方法是反转您的内部 for 循环。现在,您基本上是在检查 i 和 j 的所有可能组合。例如,对于索引 1、2、3、4。您正在检查 1-2、1-3、1-4、2-3、2-4、3-4。

相反,您可以从 j = a.length()-1 开始。这样,您就可以从当前 i 的“最长组合”开始。一旦组合起作用(意味着如果组合满足 Sum(1, i, j)%3 == 0 要求),您不必检查所有其他 j 值,您可以跳转到下一个 i价值。

你的 Sum 方法很好。

编辑:

结果仍然是 O(n^3) 最坏情况的时间复杂度。但实际上,它能否使您的代码更快?当然是) 由于您有 3 次迭代,因此最坏的情况总是 N^3。

【讨论】:

  • 非常感谢!很抱歉我不能投票,我没有足够的声望
  • 我很高兴它有帮助。我添加了另一个编辑。如果您还有其他问题,请告诉我。
  • 如果我理解正确,您的意思就是将 Method3 中的内部循环更改为:for (int j=a.length-1; j>0; j--) 对吗?但是在那种情况下,(除非它是最好的情况),复杂性还是一样的,不是吗?或者这就是全部?无论如何,在原始程序中 - 复杂度总是 n^3。但是现在,最坏的情况是 n^3,但最好的情况是 O(n)?
  • 它仍然会是 N^3 最坏情况的时间复杂度,但实际上,它可能会使您的代码更快。但是,是的,因为你有 3 次迭代,最坏的情况总是 N^3
  • 最好的情况是 N 还是 O(1)?另外,我怎么知道平均情况是多少?它在现实中是否重要?最后一个问题,当你创建一个新算法或者只是为一个问题编写一个特定的解决方案时,你怎么知道它具有最佳复杂度并且你可以停止思考更好的解决方案?非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多