嵌套循环的复杂性

时间:2019-03-25 10:04:16

标签: c# algorithm time-complexity

我有这个C#方法:

private void Process()
{

  foreach (Vat vat in vats) // n elements
  {
    foreach (ProcessResultRow row in processResultRows) // m elements
    {
      // something here
    }

    foreach (KeyValuePair<int, Shop> entry in _shopsList) // j elements
    {
      // something else here
    }
  }

}

我知道两个嵌套循环的复杂度为O(n^2)。在这个例子中对吗?

我不确定,因为在外部周期中,我有两个相同水平的冰柱。

2 个答案:

答案 0 :(得分:4)

假定循环没有returnbreak等(例如抛出异常),则复杂度为

O(n * (m + j)) == O(n * m) + O(n * j)

如果mj都是常量,我们就有

O(n*m + n*j) == m * O(n) + j * O(n) == O(n)  

如果至少有一个mj使得m ~ nj ~ n,那么我们有

// here m ~ n and j is some const
O(n * m) + O(n * j) == O(n * n) + j * O(n) == O(n**2) + O(n) == O(n**2)

答案 1 :(得分:2)

正如@RobinBennet所说,答案是O(n * (m + j))

外循环迭代n次(每个元素一个)。 对于外部循环中的每个元素,第一个内部循环重复m次,第二个j次-因此,对于每个元素,您都执行O(m + j)步骤。遍历n个元素O(n *(m + j)。

也就是说,假设m,j与n不相关-例如,如果m = j = n,则得到O(n ^ 2)

相关问题