我有一个算法,首先,对矢量进行排序,然后遍历其元素并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)
并且不要将它们相加?
答案 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)
。