我需要计算以下代码的基本操作:
public static int findmax(int[] a, int x) {
int currentMax = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > currentMax) {
currentMax = a[i];
}
}
return currentMax;
}
我知道原始操作(例如为变量赋值)的值为1
。因此,此处为a[0]
帐户分配currentMax
原始操作已执行。
在for循环中:将1
分配给1
,同时考虑i
。每个1
和i < a.length
都是i++
(即n - 1
)。但是,我对如何处理2(n-1)
语句感到困惑。我知道我们正在寻找最坏的情况(所以我们需要执行if
条件和嵌套在该块中的语句)。但是我不确定这是什么原始操作。
答案 0 :(得分:3)
循环迭代之前
int currentMax = a[0];
作业:计算 1 。
int i = 1
作业:计算 1
对于循环的n次迭代中的每次迭代(请注意,此处,n = a.length-1)
i < a.length
比较(返回true):计为 1
i++
增量:计为 1
a[i] > currentMax
比较:计为 1
currentMax = a[i];
作业:计为 1
存在循环时
i < a.length
比较(返回false):计为 1
<强>结论强>
在最坏的情况下,你有1 + 1 + n *(1 + 1 + 1 + 1)+ 1 = 4 * n + 3个基本操作,因此算法的复杂度为Θ(n)。
更具体地说,要处理if语句,您当然要考虑其参数的计算,但单词“if”本身不计算。处理器根据结果立即跳转到下一条指令。有些人可能认为这种条件跳跃可能算作1,但无论如何这并不重要,因为4 * n + 3与5 * n + 3相同的复杂度,即Θ(n)。
如果你想要精确并保持常数,那么你必须指明它究竟是什么意思,例如:
在这种情况下,很明显您决定将其视为基本操作。但是,例如,您可能还决定访问像a[i]
这样的数组值得计算(它实际上是一个指针添加加一个内存访问),所以你要添加:
或者,如果您想要更精确,并将访问之一a[0]
并且不执行指针算法这一事实分开,您会说:
所以你看到由你决定你的“基本操作”是什么,所有答案都是正确的。