所以,我有这个代码,我需要让它运行时间复杂度小于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);
我想我明白为什么它是O(n ^ 3),但我真的不知道如何让它更有效率。我尝试将其转换为递归函数,是否可能?
答案 0 :(得分:4)
你为每个i,j,k的结果加1,0 <&lt; k&lt; j&lt;我&lt; ñ。我们选择(n-1,3)这样的i,j,k值(对于{1,2,...,n-1}的大小3的每个子集一个)。 (这里&#34;在二项式系数函数中选择&#34;。)
因此,如果(n - 1)(n - 2)(n - 3) / 6
为正数,则可以选择(n-1,3)取代基于循环的计算,n
。
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(log N)输出它(因为结果有O(log N)数字)。
答案 1 :(得分:2)
你当前的函数只是计算某些数学函数的一种糟糕的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
最终将等于迭代次数。
您的作业可能会重新解释为循环进入等式。
我们知道外循环将执行其块(n-1)
次。下一个内部循环将执行其块总共1+2+..+(n-2)
次。 That's (n-1)(n-2)/2
次。https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) (n - 1)(n - 2)(n - 3)
次。 (此时我被卡住了,我的推断都没有得到(n-1)(n-2)(n-3)/ 6)
另一种方式:既然我们知道1,2,3都是零根,我们也知道至少的函数是n=4
。求解1/6
并得到<ResourceDictionary>
<Style x:Key="LayoutStyle" TargetType="RelativeLayout">
<Setter Property="BackgroundColor" Value="Maroon"/>
<Setter Property="RelativeLayout.HeightConstraint" Value="{ConstraintExpression RelativeToParent,Property=Height,Factor=0.9,Constant=0}"/>
<Setter Property="RelativeLayout.WidthConstraint" Value="{ConstraintExpression RelativeToParent,Property=Width,Factor=0.9,Constant=0}"/>
<Setter Property="RelativeLayout.YConstraint" Value="{ConstraintExpression RelativeToParent,Property=Height,Factor=0.05,Constant=0}"/>
<Setter Property="RelativeLayout.XConstraint" Value="{ConstraintExpression RelativeToParent,Property=Width,Factor=0.05,Constant=0}"/>
</Style>
</ResourceDictionary>
作为常数因子。
答案 2 :(得分:1)
我按如下方式重构你的循环:
for(i=1; i<n-2; i++)
{
x = x + ( ( i * ( i + 1 ) ) / 2 );
}
这是有效的,因为( ( i * ( i + 1 ) ) / 2 )
=系列1到i中所有值的总和。
你最内循环(使用变量k)相当于将j的值添加到x。你的第二个循环(使用变量j)相当于计算系列1到i的总和。
所以我用系列1到i的总和替换了你的第二个和第三个循环。我们保留您的第一个循环,并在每次迭代时将系列1到i的总和添加到您之前的值。
请注意,我已在您的外部循环中添加了-2
来模拟&lt;签到你的两个内环。如果您的要求在每个内循环上都是&lt; =那么就不需要-2
。
这是一个O(n)解决方案,不如Paul Hankin's O(1) solution。