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)个操作。怎么会这样?