计算排序的复杂度
calculating complexity of sorting
std::sort执行大约N*log2(N)(其中N为距离)的元素比较(来源- http://www.cplusplus.com/),因此其复杂度为N*log2(N)。请帮我计算下一个代码的复杂度:
void func(std::vector<float> & Storage)
{
for(int i = 0; i < Storage.size() - 1; ++i)
{
std::sort(Storage.begin()+i, Storage.end());
Storage[i+1] += Storage[i];
}
}
= N ^ 2 * log2复杂性(N)或2 log2 (2) + 3 log2(3) +……+ (N) log2 (N) ?谢谢你。
计算复杂度的正确方法是对规模线性增加的重复O(K Log K)
问题K = 1 ... N
的复杂度进行评估。这可以通过计算和来实现,也可以通过计算积分
Integrate[K Log[K], {K, 0, N}]
例如Mathematica,你得到
1/4 N^2 (-1 + 2 Log[N])
是O(N^2 Log N)
。
尽管对于多项式函数和对数函数它是成立的,但是对于复杂度为f(K)
的K = 1 ... N
子问题的积分一般不等于N f(N)
。例如复杂度Exp[K]
的K = 1 ... N
子问题的和就是Exp[N]
,而不是N Exp[N]
。
我同意N^2*log2(N)
,因为排序算法运行N次。在Big-O中,c
是常量:
c*N * N*log2(N) => O(N^2*log2(N))
它将渐近为O((N^2)*(log2(N))
we need sum of k*log2(k) k from 1 to N
你正在对对数函数求和:
complexity <- 0
for i = 1..N
complexity += i Log(i)
导致总结:
Log(1) + 2 Log(2) + ... + N Log(N)
从http://en.wikipedia.org/wiki/Logarithm :
乘积的对数是因子的对数之和:
:
的和变成:
Log(1) + Log(2^2) + .. + Log(N^N)
进一步简化:Log(1*2^2*3^3*...*N^N)
相关文章:
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何计算函数的时间复杂度?
- 如果代码包含多个复杂度循环,如何计算复杂度
- 如何计算函数的搜索复杂度
- 标准::映射::合并的计算时间复杂度
- 如何计算三角数生成的运行时复杂度
- 内省排序优于合并排序(时间复杂度)
- C++对向量进行时间复杂度排序
- 气泡排序算法的空间复杂度.
- 对于给定的n个数字序列,找到具有最大总和和尽可能低的计算复杂度的子串
- 快速排序时间复杂度
- 计算 BST 节点移除的时间复杂度
- 用stl向量计算复杂度
- 递归函数的时间复杂度计算
- 指针复杂度的排序向量
- 如何在时间和空间复杂度的限制下交替对偶数和奇数进行排序?(C/C++)
- 计算排序的复杂度
- 以低复杂度计算K个连续数字模组1000000007的LCM的程序