算法的平均复杂度

时间:2016-06-18 17:56:23

标签: algorithm loops time-complexity

我的老师给了我以下代码,以了解他的平均复杂程度:

 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。我知道平均复杂度的定义非常相似,但我发现很难计算它。我想知道这种情况下的复杂性是什么,以及是否有计算这些类型问题的标准化方法

(例如:迭代器之间具有依赖关系的嵌套循环)。

2 个答案:

答案 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)。