我有这个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)
。在这个例子中对吗?
我不确定,因为在外部周期中,我有两个相同水平的冰柱。
答案 0 :(得分:4)
假定循环没有return
,break
等(例如抛出异常),则复杂度为
O(n * (m + j)) == O(n * m) + O(n * j)
如果m
和j
都是常量,我们就有
O(n*m + n*j) == m * O(n) + j * O(n) == O(n)
如果至少有一个m
或j
使得m ~ n
或j ~ 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)