c - 求大 O 时间复杂度

标签 c algorithm time-complexity big-o

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

最佳答案

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

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 <= n; i++) : O(n) [实际上恰好执行 n 次]
  • for(j = n - i; j >= 2; j -= 2) : (n-1)/2在第一次迭代中,(n-3)/2在第二个等等... O(n)
  • for(k = 1; k <= j; k++) n-2在第一次迭代中,n-3在第二个等等... O(n)
  • s = s + Arr[k]; 【操作简单】:O(1)

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

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

关于c - 求大 O 时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48515622/

相关文章:

c - 如何使用文件结构?

c - 此 C 代码应该会失败,但它可以工作。这是为什么?

algorithm - 识别二进制文件中的算法

algorithm - 归并排序在递归版本中的运行时间

algorithm - 词典解析

objective-c 检查 float 和 int 是否相等——2.0000 == 2

c - ISO C 和有符号文字常量

c - 如何在C中使用水库采样实现随机选择树节点的功能

c++ - 在 3 个字符串 vector 中查找连接

algorithm - 集合覆盖概率的变体(可能是事件选择概率)