计算排序的复杂度

calculating complexity of sorting

本文关键字:复杂度 计算排序      更新时间:2023-10-16

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)