Algorithm 计算初等运算
我需要计算以下代码的基本操作:Algorithm 计算初等运算,algorithm,complexity-theory,Algorithm,Complexity Theory,我需要计算以下代码的基本操作: 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; } 公共静态int find
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;
}
公共静态int findmax(int[]a,int x){
int currentMax=a[0];
for(int i=1;icurrentMax){
currentMax=a[i];
}
}
返回电流最大值;
}
我知道一个基本操作(比如给变量赋值)的值是1
。因此,这里将a[0]
分配给currentMax
说明执行的1
基本操作
在for循环中:将
1
分配给i
,也会导致1
。和i
和i++
分别是n-1
(即2(n-1)
)。但是,我对如何处理if
语句感到困惑。我知道我们正在寻找最坏的情况(因此我们需要执行if
条件和嵌套在该块中的语句)。但我不确定这是一个基本操作。在循环迭代之前
int currentMax = a[0];
分配:计数1
int i = 1
作业:计数1
i++
a[i] > currentMax
currentMax = a[i];
对于循环的n次迭代中的每一次(注意,此处n=a.length-1)
递增:计为1
i++
a[i] > currentMax
currentMax = a[i];
比较:计为1
i++
a[i] > currentMax
currentMax = a[i];
作业:计为1
i++
a[i] > currentMax
currentMax = a[i];
当存在循环时
i < a.length
i
比较(返回false):计数为1
i++
a[i] > currentMax
currentMax = a[i];
结论
在最坏的情况下,你有1+1+n*(1+1+1+1)+1=4*n+3个基本运算,因此你的算法的复杂度是Θ(n)
更具体地说,要处理if语句,您当然必须考虑其参数的计算,但“if”一词本身并不重要。处理器只是根据结果立即跳转到下一条指令。有些人可能会争辩说,这种条件跳转可能算作1,但无论如何,这并不重要,因为4*n+3与5*n+3的复杂度相同,即Θ(n)
如果要精确并保持常量,则必须指定其确切含义,例如:
- n+2作业
- 氮增量
- 2*n+1比较
a[i]
这样访问数组是值得计算的(实际上是一个指针加上一个内存访问),因此您可以添加:
- 2*n+1阵列访问
a[0]
这一事实分开,并且不执行指针算术,您可以说:
- 2*n+1内存访问
- 2*n指针加法
所以你们看,什么算是“基本运算”取决于你们自己,所有答案都是同样正确的。这个问题看起来很相似。嗨,是的,很相似。我被告知if语句的两行都用于2(n-1)个操作。怎么会这样?