C、 西格玛的时间复杂性?

C、 西格玛的时间复杂性?,c,algorithm,time-complexity,code-complexity,C,Algorithm,Time Complexity,Code Complexity,如何找到以下代码的时间复杂度: (很抱歉添加图像,我将在访问笔记本电脑后重新编辑我的问题) 到目前为止我所做的: 第一个循环迭代n次,第二个i次,第三个log(i*j)次,因此简化后得到: 对于i*logi+n*,σ从i=0到n(对于logi,σ从j=0到i) 但为什么这等于O(n^2 log(n))?方法1: 在最坏的情况下: 第一个循环执行n次。 第一个循环的时间复杂度=O(n) 第一和第二循环的时间复杂度 =1+2+3+4+…+n=O(n*(n+1)/2)=O(n^2) 我们可以计算第三

如何找到以下代码的时间复杂度:

(很抱歉添加图像,我将在访问笔记本电脑后重新编辑我的问题)

到目前为止我所做的:

第一个循环迭代n次,第二个i次,第三个log(i*j)次,因此简化后得到:

对于i*logi+n*,σ从i=0到n(对于logi,σ从j=0到i)


但为什么这等于O(n^2 log(n))?

方法1

在最坏的情况下:

第一个循环执行n次。 第一个循环的时间复杂度=
O(n)

第一和第二循环的时间复杂度 =
1+2+3+4+…+n
=
O(n*(n+1)/2)
=
O(n^2)

我们可以计算第三个循环的复杂度,并将其与先前计算的复杂度相乘,因为第三个循环不会影响(更改第一个或第二个循环的任何变量)先前循环的变量

第三个循环的时间复杂度=
log(i*j)

=
log(i*j)
=
log(n*2)
=
2log(n)

=
log(n)

最终复杂性=
O(n^2*(log(n))

方法2

如果我们用log(i*j)来表示,它看起来会像这样

log(1) + log(2) + log(3) + ... + log(n*(n-1))
=

请参阅下面的结果

log((n-1)!) = nlogn
最终复杂性:

O(n* nlog(n))
=


如果我们观察最外面的2个循环,我们会发现有
1+2+3…+n-1
迭代。使用关于级数求和的标准事实(或者如果你想深入证明的话,使用归纳法),我们可以看到这
O(n^2)

最里面的循环是
log(n)
。证明这一点的最简单方法是使用。您可以按以下形式编写一个循环:

LoopIterations(n)=LoopIterations(n/2)+1

其中,
LoopIterations
是从起点n开始的迭代次数。主定理告诉我们,
LoopIterations(n)
O(log(n))

一个微妙之处是,我们递归的初始条件是
LoopIterations(n^2)
,但由于
log(n^2)=2 log(n)
,这不会影响最终的计算复杂性,因为我们可以忽略常量因子


@Kaushal介绍了为什么可以将上述两个结果相乘得到O(n^2 log(n)),不过我想补充一点,如果你想说服自己,你可以对这类问题进行归纳,尽管这可能会很长。

第三个循环迭代
log(I*j)
次,因为
k/=2
@bereal更正了那部分(忘了写了),谢谢!为什么最后一行之前的那一个是log(n)你是怎么得到的?乘法日志中的日志和1*2*…*n^2的总和不一定是n!你也碰巧得到了正确的答案。如果你已经对所有
log(i*j)进行了求和
术语那么你不应该将结果乘以它们的数量。另外,正如OP正确指出的,
log(1)+log(2)+log(3)+…+log(n*(n-1))
的和不等于
O(log(n))
,而是等于
log([n*(n-1)]
(阶乘),然后可以扩展到
O(n^2*log(n))
with。这与之前的答案所采用的方法完全相同(该答案也是偶然得出正确答案的),这是不正确的,因为它不能普遍应用,因为循环不是独立的。您对每个
log(i*j)
项求和的原始想法是正确的,但数学是错误的。
O(n* nlog(n))
O(n^2)*log(n)