【问题标题】:Finding the Big O time complexity求大 O 时间复杂度
【发布时间】:2018-07-08 23:54:40
【问题描述】:
i = 1;     
while (i <= n) {
     j = n - i;
     while (j >= 2) {
         for (k = 1; k <= j; k++) {
             s = s + Arr[k];
         }
         j = j - 2;
     }
     i = i + 1;
}

让我困惑的部分是它说的地方

j = n - i;
while(j >= 2){

我不太确定如何展示我在这方面的工作。我很确定算法是 O(n^3)。

【问题讨论】:

  • 是的,它是O(n^3)。您的while 等同于for (j = n-i; j &gt;= 2; j -= 2),您可以将其替换为for (j = 2; j &lt;= n-i; j += 2)
  • 感谢您的帮助

标签: c algorithm time-complexity big-o


【解决方案1】:

为了看得更清楚,你可以稍微简化一下:

for(i = 1; i <= n; i++)
{
    for(j = n - i; j >= 2; j -= 2)
    {
        for(k = 1; k <= j; k++)
        {
            s = s + Arr[k];
        }
    }
}

现在事情应该更简单了

  • for(i = 1; i &lt;= n; i++) : O(n) [实际上执行 n 次]
  • for(j = n - i; j &gt;= 2; j -= 2) : (n-1)/2 在第一次迭代中,(n-3)/2 在第二次等等... O(n)
  • for(k = 1; k &lt;= j; k++) n-2 在第一次迭代中,n-3 在第二次迭代中等等... O(n)
  • s = s + Arr[k]; [简单操作] : O(1)

将每一步相乘,得到O(n^3)

如果您仍然遇到问题,我建议您使用不同的 n 值和循环内的计数器运行此代码的一些模拟。希望您能够看到 O(n) 是每个循环的复杂度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多