Big O分析中方法调用和返回语句的成本是多少?

时间:2018-01-27 22:11:35

标签: java algorithm asymptotic-complexity

我刚刚开始进行算法分析,当涉及到方法调用和返回语句的成本时,似乎会出现歧义。有些消息来源与其他消息来源不同,所以我希望对此进行一些澄清。拿我写的这个算法计算一个最大子阵列(取自伪代码):

public static int maxSubFastest(int[] array)
    {
        //index variable t
        int t;
        Integer[] M = new Integer[array.length];
        //initial prefix maximum
        M[0] = 0;

        for (t = 1; t < array.length; t++)
        {
            M[t] = max(0, M[t - 1] + array[t]);
        }
        //maximum found so far
        int m = 0;
        for (t = 1; t < array.length; t++)
        {
            m = max(m, M[t]);
        }
        return m;
    }

方法调用:

//method to calculate the max for maxSubFastest
    public static int max(int a, int b)
    {
        return a > b ? a:b;
    }

我对这个算法的初步分析给了我:

T(n)= 8(n-1)+ 9

= 8n - 8 + 9

= 8n + 1 = O(n)

我知道最后的结果仍然是O(n),但在这里,我算了一下:

M[t] = max(0, M[t - 1] + array[t]);

作为成本2(n - 1),(n - 1)用于赋值和(n - 1)用于方法调用。我最后没有计算退货声明。

这看起来是一个相当准确的分析吗?我应该将方法调用计算为超过成本1 *(n - 1)以及最后的return语句吗?我真的好奇听到人们对这个话题的看法,所以我希望能得到一些澄清。谢谢。

1 个答案:

答案 0 :(得分:3)

<强> TL; DR

调用方法是O(1),执行它的主体取决于方法,并且从方法返回是O(1)。总的来说,它是方法主体的Big-O(只要不是或多或少不可能的O(0))。

长解释

方法调用(从调用者方面看)由三部分组成:

  • 将控制和参数传递给被调用的方法。由于Java在将实例或数组内容作为agruments传递之前不会复制实例或数组内容,因此对于每个单独的参数来说,这是一个恒定的时间,因此对于固定的参数列表,这也是整个常量时间。所以这里我们有O(1)。如果要将复杂的表达式作为参数传递,请在方法调用之外计算它们。
  • 执行方法体(包括任何复杂的返回表达式)。那当然取决于方法。你的max(a,b)方法没有循环,所以它也是常数:O(1)。
  • 回归一些价值。再一次,Java没有内容复制可能导致这里的变量时间,所以它是恒定的时间:O(1)。

您可能会问,将控制转移到no-args方法与使用10个参数的方法相同。让我们说它是1用于准备和执行方法调用,而1用于传递单个参数。然后你得到1为第一个案件和11为第二个案件。但对于Big-O,11与1相同(均为常数),因此结果为O(1)。