我有一个数组,我想比较彼此之间的元素,但是想避免多次比较它们,所以换句话说,一旦我将数组[0]与数组[1]进行比较,我就不会想要再次将数组[1]与数组[0]进行比较,我将得到这个代码:
for(var i:int = 0; i < array.lenght; i++){
var entity:Object = array[i];
for(var j:int = i; j < array.lenght; j++){
//do stuff
}
}
这不是O(N ^ 2),也许是O(logN)?你用什么方法来计算它?。
答案 0 :(得分:4)
你必须计算内部块执行的次数:
表示数组长度为n
,其中n =
3 => 2 + 1 = 3
4 => 3 + 2 + 1 = 6
5 => 4 + 3 + 2 + 1 = 10
6 => 5 + 4 + 3 + 2 + 1 = 15
因此,对于长度为n的数组,它执行内部块的次数(通过比较或其他)是小于n的所有整数的总和。 事实上,有一个众所周知的公式可以将所有整数加总,而不是n:
(n - 1) * n / 2
让我们将其扩展为以下内容:
1/2 * (n^2 - n)
所以,用大词来说:
您可以忽略-n
,因为当n很大时会发生相对较小的变化(例如n = 1000
,然后n ^ 2
是1000000
,所以{ {1}}仅为-n
的0.1%,n ^ 2
越大,其影响越小。
这引导我们做到以下几点:
n
这个常数在传统上被忽略了(因为它不会影响我们需要测量的增长率),所以现在我们只有1/2 * (n ^ 2)
所以答案是n ^ 2
答案 1 :(得分:-2)
在这种情况下,这是一个索引问题。你选择元素并且不与整个数组进行比较,而是从元素索引+ 1开始比较数组。例如(伪代码):
var index:int = 0;
while(index < array.length - 2)//no need to run for last element
{
var element:* = array[index];
for(var i:int = index + 1; i < array.length; i++)
{
//compare element with array[i]
}
index++;
}
第一次迭代将遍历数组 - 一个元素然后在下一个循环中它将通过数组 - 2等,直到它到达退出后的第二个最后一个元素。