如何计算算法的运行时间

时间:2014-07-30 15:09:41

标签: arrays performance algorithm time-complexity

我正在努力提高我在算法方面的知识,我想知道是否有人可以给我一个很好的解释如何轻松计算运行时间。

boolean hasDuplicate(int[] array) {
    for (int i = 0; i < array.length; i++) {
       for (int j = 0; j < array.length; j++) {
            if (array[i] == array[j] && i != j) {
                return true;
            }
       }
    }
    return false;
}

所以它说: 该数组需要运行O(n 2 ),因为每个元素必须与n个元素进行比较(其中n是数组的长度)。因此,如果我们将输入值加倍,那么我们的时间会翻两番。

问题:

让我们说阵列是[1,2,3],如果我们将它加倍[1,2,3,4,5,6],那么它如何变为四倍?难道不是运行时间加倍吗?

5 个答案:

答案 0 :(得分:1)

if语句执行array.length * array.length次。如果O(N^2)表示数组长度,则为N

答案 1 :(得分:0)

这是考虑这个问题的一种方法 - 你的for循环遍历数组中所有可能的索引对(你知道为什么吗?)

假设您有一个长度为n的数组。这个数组中有n 2 可能的索引对(你明白为什么?)。如果将数组的大小加倍到2n,那么可能的索引对的数量是(2n) 2 = 4n 2 。请注意,这是原始数字的四倍,这意味着需要考虑的对数是其四倍。因此,由于代码的运行时间与数组中索引对的数量成正比,因此运行时应该增加四倍。

更一般地说,当您将输入的大小加倍时,任何二次时算法都应该花费大约四倍的时间。

希望这有帮助!

答案 2 :(得分:0)

循环迭代数组n次。比如说,考虑第一个循环:

for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array.length; j++) {
        if (array[i] == array[j] && i != j) {
            return true;
        }
   }
}

变量i的值为0n-1n表示您案例中数组的长度。

对于i的每个值,变量j的值为0n-1

说,n = 5。然后

i = 0  j <-- 0,1,2,3,4
i = 1  j <-- 0,1,2,3,4
i = 2  j <-- 0,1,2,3,4
i = 3  j <-- 0,1,2,3,4
i = 4  j <-- 0,1,2,3,4

您可以看到索引更改5 x 5 = 25 times。这等于n-squared times

答案 3 :(得分:0)

我学习它的方式是:作为一项实验,将程序更改为不直接使用比较。相反,编写一个执行比较的函数compareTo,但也跟踪已完成的比较次数。然后执行以下操作:

  1. 使用O(n ^ 2)算法和K,2K,3K,4K元素运行排序。记录已排序的元素数量和每次运行的比较次数。
  2. 重复1,但使用O(n log n)排序。
  3. 绘制结果图表
  4. 你应该看到,实际上,第一个得到了一个二次曲线,第二个得到了一条线和一个二次曲线。

答案 4 :(得分:0)

给出你的例子,对于[1,2,3]输入

        if (array[i] == array[j] && i != j) {
            return true;
        }

这部分代码执行3 * 3 = 9次,但当输入为[1,2,3,4,5,6]时,这部分代码执行6 * 6 = 36次。这就是运行时的四倍(36/9 = 4)。

通常,当输入中的元素数量为N时,此if语句执行N * N次,这使得运行时O(N ^ 2)。