Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将嵌套for循环转换为低于O(n^3)_C_Time Complexity_Big O - Fatal编程技术网

C 将嵌套for循环转换为低于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; }

所以,我有这段代码,我需要让它在时间复杂度小于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;
        }
    }
}
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