这属于什么大(O)复杂性?

时间:2015-10-09 20:07:35

标签: performance actionscript-3 big-o

我有一个数组,我想比较彼此之间的元素,但是想避免多次比较它们,所以换句话说,一旦我将数组[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)?你用什么方法来计算它?。

2 个答案:

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

所以,用大词来说:

  1. 您可以忽略-n,因为当n很大时会发生相对较小的变化(例如n = 1000,然后n ^ 21000000,所以{ {1}}仅为-n的0.1%,n ^ 2越大,其影响越小。 这引导我们做到以下几点:

    n

  2. 这个常数在传统上被忽略了(因为它不会影响我们需要测量的增长率),所以现在我们只有1/2 * (n ^ 2)

    < / LI>

    所以答案是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等,直到它到达退出后的第二个最后一个元素。