我刚刚开始进行算法分析,当涉及到方法调用和返回语句的成本时,似乎会出现歧义。有些消息来源与其他消息来源不同,所以我希望对此进行一些澄清。拿我写的这个算法计算一个最大子阵列(取自伪代码):
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语句吗?我真的好奇听到人们对这个话题的看法,所以我希望能得到一些澄清。谢谢。
答案 0 :(得分:3)
<强> TL; DR 强>
调用方法是O(1),执行它的主体取决于方法,并且从方法返回是O(1)。总的来说,它是方法主体的Big-O(只要不是或多或少不可能的O(0))。
长解释
方法调用(从调用者方面看)由三部分组成:
max(a,b)
方法没有循环,所以它也是常数:O(1)。您可能会问,将控制转移到no-args方法与使用10个参数的方法相同。让我们说它是1用于准备和执行方法调用,而1用于传递单个参数。然后你得到1为第一个案件和11为第二个案件。但对于Big-O,11与1相同(均为常数),因此结果为O(1)。