C 计算此函数的复杂性

C 计算此函数的复杂性,c,time-complexity,C,Time Complexity,这就是功能: void f(int n) { for(int i=0; i<n; ++i) for(int j=0; j<i; ++j) for(int k=i*j; k>0; k/=2) printf("~"); } 因此,我得到的时间复杂度是nlog(n!)(因为loga+logb=log(a*b),并且因为n-1,n-2,n-3,…,它们总共出现了n-1次 然而,正确的答案是n^2*logn,我不知道我的错误在哪里。这里有人能帮忙吗 非常

这就是功能:

void f(int n)
{
 for(int i=0; i<n; ++i)
   for(int j=0; j<i; ++j)
     for(int k=i*j; k>0; k/=2)
       printf("~");
}
因此,我得到的时间复杂度是
nlog(n!)
(因为
loga+logb=log(a*b)
,并且因为n-1,n-2,n-3,…,它们总共出现了n-1次

然而,正确的答案是
n^2*logn
,我不知道我的错误在哪里。这里有人能帮忙吗

非常感谢!

log(n!)
可以近似为
(n+1/2)log(n)-n+常量(请参阅)

因此复杂性是
n*n*log(n)
,正如预期的那样

更简单:一个循环一个循环地独立计算复杂性,并将它们相乘

前2个外部循环:琐碎:
n
每个循环使
n^2

内部循环:有一个
log(n**2)
复杂性,与
log(n)

因此
n^2log(n)
是正确的答案。

复杂性是
O(n*n*LOG_2(n^2))

第一个和第二个循环都有
O(N)
,而
k
中的最后一个循环有对数增长

LOG_2(N^2) = 2*LOG_2(N) and
O(N*M)=O(N)*O(M).
O(constant)=1.

因此,对于最后一个循环的增长,您也可以精确地编写
O(LOG_2(N^2))=O(LOG(N))

。更准确地说,第一个循环是N,第二个循环显然是N/2平均值,内部是一些因子乘以LOG N²;而LOG N²是2 LOG N。然后去掉常数因子。
LOG_2(N^2) = 2*LOG_2(N) and
O(N*M)=O(N)*O(M).
O(constant)=1.