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.