此代码的复杂性是什么?我们是否应该总结复杂性
What will be the complexity of this code? Should we sum complexities?
我有一个算法,首先对向量进行排序,然后遍历其元素并XOR
它们。我应该将排序和 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)
,并且不对它们求和?
运行时受排序步骤的限制,O(nlgn)
.for 循环可能具有O(n)
复杂性,但整个运行时始终由最高功率主导。有关数学证明,请参见此处:
https://math.stackexchange.com/questions/324200/big-o-notation-sum-rule
是的,你可以对它们求和:O(n)
和O(n log n)
变得O(n + n log n)
. 但请注意,这不是您所建议的O(2n log n)
,因为加法是在基本算术中的乘法之后进行的。
现在,正如O(1 + n)
总是简化为O(n)
一样,您的O(n + n log n)
将减少到O(n log n)
,因为单独n
项小于n log n
项,而大O表示法始终是关于极限,而不是确切的方程。
有些人可能会发现更直观地从一开始就认识到O(n)
是由O(n log n)
主导的,并且从一开始就从不对它们求和。 这是一个有用的心理捷径,但两种观点都能给你带来相同的结果。
复杂度类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)
。
我们计算复杂性的方法是在所有复杂度中选择最高的。
因此,假设您有以下代码
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)
,O(N+N log N)
不会给你O(2N log N)
,它会给你O( (log N+1) * N)
。 这个算法将以O(N log N)
为界,因为当N接近无穷大时,它的增长速度比O(N)
快。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 通过引用访问矢量元素是否会降低C++的空间复杂性?
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 均衡符号和初始化之间的时间和空间复杂性是否存在差异
- 程序的时间复杂性确定两个字符串是否彼此排列
- 用宏替换重复"if"块是否会降低C++中的代码复杂性?
- 分支预测的加速是否取决于谓词的复杂性?
- map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?
- 复杂性理论-二进制搜索是否具有deque C++数据结构的对数性能
- 此代码的复杂性是什么?我们是否应该总结复杂性