【问题标题】:Number of steps in a nested loop嵌套循环中的步骤数
【发布时间】:2017-03-25 13:12:50
【问题描述】:

我正在尝试计算为以下嵌套循环执行的步骤数,专门用于渐近增长。根据步数,我将推导出该算法的大 O。

def get_multiples(list):
    multiple = []
    for o in list:
        for i in list:
            multiple.append(o*i)
    return multiple

我计算的方式如下(列表包含大量元素=“n”):

  1. 作业说明(步骤数 = 1):

    multiple = []
  2. 嵌套循环:

    for o in list:
       for i in list:
           multiple.append(o*i)
    

    在外循环中,变量 o 被赋值 n 次。每次执行外循环时,首先将变量 i 分配 n 次,然后将变量乘以 n 次,最后将列表附加 n 次。因此没有。步数 = n*(n+n+n) = 3n2

  3. 返回语句(步数 = 1):

    return multiple

因此总数。步数 = 3n2 + 2

但正确答案是 3n2 + n +2。显然,外部循环的执行需要额外的 n 步骤,而内部循环不需要。

有人可以向我解释我错过了什么吗?

它对复杂性没有影响,因为它仍然是 O(n2)

【问题讨论】:

  • 你自己写的:“在外循环中,变量o被赋值了n次”。
  • @n.m 答案应该是这样的:1 + n*(3*n +1)。每次循环执行时都会发生外部循环变量赋值,因此它是结果中的乘数 n。我的问题是为什么每次外部循环执行时我们仍然需要考虑额外的 1 步,即 "n*(...+1) 部分。

标签: algorithm time-complexity big-o


【解决方案1】:

我认为计算嵌套循环的正确方法如下:

号码o被分配了n次。 数字 i 被分配 n2 次,o*i 被计算 n2 次,append 函数被调用 n2 次。

因此 n + n2 + n2 + n2 = 3n2 + n

将它添加到其余部分,你得到 3n2 + n + 2

【讨论】:

    【解决方案2】:
    def get_multiples(list):  
      multiple = []  // 1 STEP  
      for o in list:  // Executed n times, so n STEPS  
        for i in list: // Executed n times for each value of o, so n*n STEPS  
          multiple.append(o*i) // 1 STEP to multiply and 1 STEP to append, repeated for each pair of (o, i), so 2*n*n STEPS  
      return multiple // 1 STEP  
    

    添加上述内容:1 + n + n2 + 2n2 + 1 = 3n2 + n + 2

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多