这段代码的复杂性是什么?我们应该总结复杂性吗?

时间:2016-07-03 16:40:30

标签: c++ algorithm sorting time-complexity asymptotic-complexity

我有一个算法,首先,对矢量进行排序,然后遍历其元素并XOR。我应该总结sort和for循环的复杂性来计算整体算法的复杂性吗? 所以,我有下一个代码:

std::sort(array.begin(), array.end());
for (int i =1; i < array.size(); ++i) {
  result = array[i-1]^array[i];
}

我们有一个for循环,其O(N)复杂度和std::sort平均值进行O(N log N)次比较。 那么下一个代码的复杂性将是O(N + N log N)? 或者在这种情况下,我们只需要选择最高时间复杂度类,即线性时间O(N log N)并且不要将它们相加?

5 个答案:

答案 0 :(得分:1)

运行时受排序步骤O(nlgn)的限制。 for循环可能具有O(n)复杂度,但总体运行时总是由最高功率控制。请参阅此处获取数学证明:

https://math.stackexchange.com/questions/324200/big-o-notation-sum-rule

答案 1 :(得分:1)

是的,您可以对它们求和:O(n)O(n log n)变为O(n + n log n)。但请注意,这是 not O(2n log n),因为你建议使用,因为在基本算术中乘法后会出现加法。

现在,正如O(1 + n)始终缩减为O(n)一样,您的O(n + n log n)将缩减为O(n log n),因为单独的n字词小于n log n O(n)术语,大O符号总是关于限制,而不是确切的等式。

有些人可能会发现从一开始就认识到O(n log n)由{{1}}占主导地位,并且从不将它们排在第一位。这是一个有用的心理捷径,但两种观点都会得到相同的结果。

答案 2 :(得分:0)

复杂性类O(N)是类O(N log N)的子集,因为log N > 1足够高N。因此,代码O(N + N log N)的复杂性类是O(2 N log N)的子集,并且因为复杂性类是不变的w.r.t.常数,它最后是O(N log N)

答案 3 :(得分:0)

我们计算复杂性的方法是选择所有复杂性中最高的。

所以,假设你有以下代码

for i in range 0 to n
{
    for  in range 0 to n
    {
        \\ code
    }
}

for i in range 0 to n
{
    \\ code
}

所以,这里的复杂性是O(n^2) + O(n)。最终会是O(n^2)。因此,上述整个代码的复杂性为O(n^2)

同样,在您的情况下,复杂度为O(N log N) + O(N),这使得最终的复杂性为O(N log N)

答案 4 :(得分:0)

首先,O(N+N log N)不会给你O(2N log N),它会给你O( (log N+1) * N)。此算法受O(N log N)限制,因为当N接近无穷大时,此增长速度快于O(N)