我相信这个算法是O(N)。我对么?

时间:2016-06-11 19:48:43

标签: java algorithm big-o computer-science

该算法反转N个整数数组。我相信这个算法是O(N),因为对于每个循环迭代,四行代码执行一次,从而在4N时间内完成作业。

public static void reverseTheNumbers(int[] list) {
    for (int i = 0; i < list.length / 2; i++) {
        int j = list.length - 1 - i;
        int temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }
}

3 个答案:

答案 0 :(得分:6)

没有4N时间这样的东西。该算法是线性的,因为随着您增加输入的大小,算法的运行时间会按比例增加。换句话说,如果你将list的大小加倍,你会希望算法花费两倍的时间。

在循环中执行的操作数量无关紧要 - 只要它们是每个常量时间(相对于输入),循环的运行时间仅由迭代次数确定。

换句话说,这四个语句 - 全部在一起 - 是一个O(1)操作。

int j = list.length - 1 - i;
int temp = list[i];
list[i] = list[j];
list[j] = temp;

这一步骤的顺序在Java语法的四个语句中表达没有什么重要的事实 - 试验javap表明这四行编译成~20个字节码命令,谁知道字节码有多少处理器指令被转换成。好消息是无论特定语法如何,Big-O符号的工作方式都相同 - 如果执行时间相同,则无论输入如何,操作序列都是O(1)或恒定时间。

因此你进行了N次的O(1)操作;又名O(N)。

答案 1 :(得分:4)

是的,你是对的。操作数量线性地取决于数组的大小(N),使其成为O(N)算法。

答案 2 :(得分:1)

是的,算法的复杂性是O(n)。 但是,确切的“时间”(因为渐近复杂度没有常数因素,请查看下面的注释)不是数组大小的4倍,我们可以说它是1/2 *(c1 + c2 + c3 + c3)乘以数组的大小,其中1/2对应于每个循环迭代,每个c对应于循环内每个操作所需的时间。 如果算法迭代整个数组4次,它将是数组大小的4倍。