【问题标题】:Average complexity of an algorithm算法的平均复杂度
【发布时间】:2016-10-20 09:08:55
【问题描述】:

我的老师给了我下面的代码来找出他的平均复杂度:

 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 &lt; c*n^2 for n&gt;n0。我知道平均复杂度的定义非常相似,但我发现计算起来相当困难。我想知道这种情况下的复杂性是什么,是否有标准化的方法来计算这些类型的问题

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

【问题讨论】:

  • 这段代码总是做同样多的工作,所以平均情况、最好情况和最坏情况应该是一样的。
  • @templatetypedef 这也是我的猜测。但是对于我的老师,我需要一个更高的答案。
  • 我不确定我是否理解您所说的“更高”是什么意思,但只是说运行时间仅取决于长度,没有其他内容就足够了。

标签: algorithm loops time-complexity


【解决方案1】:

在平均案例分析中,我们采用所有可能的输入并计算所有输入的计算时间。对所有计算值求和,然后将总和除以输入总数。

您的算法中只有一种可能性。对于所有输入,您的算法运行时间为 O(n*(n+1)/2)。

平均时间复杂度为 O(n*(n+1)/2) = O(n^2)。

【讨论】:

    【解决方案2】:

    在计算复杂度理论中,算法的平均情况复杂度是算法使用的一些计算资源(通常是时间)的数量,是所有可能输入see here for definition 的平均值。

    在您的情况下,您已经发现您的程序将执行 n*(n+1)/2(对于给定的 n)次。那么你可以想:如果n = 1, 2, 3, ...呢?您只需使用公式将所有这些值相加并取平均值。很容易得到O(n^2)的解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多