计算基本操作

时间:2013-08-31 10:47:00

标签: 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;
}

我知道原始操作(例如为变量赋值)的值为1。因此,此处为a[0]帐户分配currentMax原始操作已执行。

在for循环中:将1分配给1,同时考虑i。每个1i < a.length都是i++(即n - 1)。但是,我对如何处理2(n-1)语句感到困惑。我知道我们正在寻找最坏的情况(所以我们需要执行if条件和嵌套在该块中的语句)。但是我不确定这是什么原始操作。

1 个答案:

答案 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)。

如果你想要精确并保持常数,那么你必须指明它究竟是什么意思,例如:

  • n + 2个作业
  • n增量
  • 2 * n + 1比较

在这种情况下,很明显您决定将其视为基本操作。但是,例如,您可能还决定访问像a[i]这样的数组值得计算(它实际上是一个指针添加加一个内存访问),所以你要添加:

  • 2 * n + 1阵列访问

或者,如果您想要更精确,并将访问之一a[0]并且不执行指针算法这一事实分开,您会说:

  • 2 * n + 1内存访问
  • 2 * n指针添加

所以你看到由你决定你的“基本操作”是什么,所有答案都是正确的。