我的老师给了我以下代码,以了解他的平均复杂程度:
int function(int a[], int n)
{
int k=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
k=k+((a[i]*a[i]+a[j]*a[j])%5==0)
return k;
}
void main()
{
int vector={0,1,2,3,4,5,6,7,8,9}
int a=function(vector, 10);
printf( "%d\n", a);
}
通过展开循环,我发现代码执行n*(n+1)/2
次,我得出结论,最坏的情况是O(n^2)
,因为n*(n+1)/2 < c*n^2
存在n>n0
。我知道平均复杂度的定义非常相似,但我发现很难计算它。我想知道这种情况下的复杂性是什么,以及是否有计算这些类型问题的标准化方法
(例如:迭代器之间具有依赖关系的嵌套循环)。
答案 0 :(得分:2)
在计算复杂性理论中,算法的平均情况复杂度是算法使用的一些计算资源(通常是时间)的量,平均所有可能的输入see here for definition。
在你的情况下,你已经发现你的程序将执行n *(n + 1)/ 2(对于给定的n)次。然后你可以想:如果n = 1,2,3,......怎么办?您只需要使用公式将所有这些值相加并取平均值。很容易得到O(n ^ 2)解。
答案 1 :(得分:1)
在平均案例分析中,我们采用所有可能的输入并计算所有输入的计算时间。对所有计算值求和,并将总和除以输入总数。
您的算法中只有一种可能性。对于所有输入,您的算法在O(n *(n + 1)/ 2)时间内运行。
平均时间复杂度为O(n *(n + 1)/ 2)= O(n ^ 2)。