C 将嵌套for循环转换为低于O(n^3)
所以,我有这段代码,我需要让它在时间复杂度小于O(n^3)的情况下运行。我刚刚开始学习复杂性,我真的不知道该怎么办C 将嵌套for循环转换为低于O(n^3),c,time-complexity,big-o,C,Time Complexity,Big O,所以,我有这段代码,我需要让它在时间复杂度小于O(n^3)的情况下运行。我刚刚开始学习复杂性,我真的不知道该怎么办 int n, i, j, k, x=0; printf("Type n: \n"); scanf("%d",&n); for(i=1; i<n; i++) { for(j=1; j<i; j++) { for(k=1; k<j; k++) { x=x+1; }
int n, i, j, k, x=0;
printf("Type n: \n");
scanf("%d",&n);
for(i=1; i<n; i++)
{
for(j=1; j<i; j++)
{
for(k=1; k<j; k++)
{
x=x+1;
}
}
}
printf("%d\n",x);
intn,i,j,k,x=0;
printf(“类型n:\n”);
scanf(“%d”和“&n”);
对于(i=1;i你要给每个i,j,k的结果加上1,0
因此,如果n
为正,可以用choose(n-1,3)替换基于循环的计算,即(n-1)(n-2)(n-3)/6
int n;
printf("Type n: \n");
scanf("%d",&n);
printf("%d\n", n > 0 ? (n-1)*(n-2)*(n-3)/6 : 0);
这是计算结果的O(1),输出结果的O(logn)(因为结果有O(logn)位)。您当前的函数只是一个糟糕的O(N^3)
计算某些数学函数的方法
In Out
0 0
1 0
2 0
3 0
4 1
5 4
6 10
7 20
8 35
9 56
10 84
x
最终将等于迭代次数
您的作业可能会将for循环重新解释为一个等式
我们知道外循环将执行其块(n-1)
次。下一个内循环将执行其块1+2+…+(n-2)
次。(n-1)(n-2)/2
次。(此时我自己陷入困境,我的推断没有一个得到(n-1)(n-2)(n-3)/6)
另一种方法:因为我们知道1,2,3都是零根,所以我们也知道函数至少是(n-1)(n-2)(n-3)
。求解n=4
,得到1/6
作为常数因子。我重构了循环,如下所示:
for(i=1; i<n-2; i++)
{
x = x + ( ( i * ( i + 1 ) ) / 2 );
}
对于(i=1;毫无疑问,对于n
来说,有一个封闭的公式可以大大加快它的速度。对于a,b,c,d的合适值,它将是((a*n+b)*n+c)*n+d
,一个简单的三次方程。递归函数不会加快速度,但可以让它工作。“我想我明白为什么它超过O(n^3)”实际上,您拥有的代码是O(n^3).是的,这就是我的意思,写错了,谢谢你指出。这件时间复杂的事情困扰着我brain@NathanDanzmann需要明确的是,目标是计算x
的最终值,还是对i,j,k
的每个组合进行处理?好的,x值需要与tho相同的输出se嵌套用于循环。目标是使其更有效。威尔,这是一个完美的方程式,工作起来非常漂亮。我只是不确定我是否理解你用来找到(n-1)*(n-2)*(n-3)/6.(n-1)*(n-2)*(n-3)的数学我理解下面对rrauenza的解释,其中它们是零根…@NathanDanzmann如果你感兴趣,这里有一些解释:。老实说,我只是在@PaulHankin揭示了公式后才注意到这些根……为了提高效率,你可以用n>3
:-)替换n>0
)好吧,这解决了我所有的疑问,非常感谢你@PaulHankin