我正在努力提高我在算法方面的知识,我想知道是否有人可以给我一个很好的解释如何轻松计算运行时间。
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],那么它如何变为四倍?难道不是运行时间加倍吗?
答案 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
的值为0
至n-1
。 n
表示您案例中数组的长度。
对于i
的每个值,变量j
的值为0
到n-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
,但也跟踪已完成的比较次数。然后执行以下操作:
你应该看到,实际上,第一个得到了一个二次曲线,第二个得到了一条线和一个二次曲线。
答案 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)。