我试图了解如何知道算法中的嵌套for循环是否会产生线性或二次Big-Oh复杂度。以下是我提出的一些示例,但与蛮力循环和图形遍历有关。我试着
我是否正在思考正确的道路?
示例1:
N = ? // Number of elements in an array of integers
For i = 1 to N
For j = 1 to N
Print "foo"
示例2:
N = ? // Number of elements in an array of integers
For i = 1 to log(N)
For-each edge of log(N)
Print "foo"
示例3:
V = ? // Total number of nodes in a graph
E = ? // Total number of edges in a graph (not of each iteration-node)
For i = 1 to V
For j = 1 to E
Print "foo"
示例4:
V = ? // Total number of nodes in a graph
For i = 1 to V
For-each edge of V[i]
Print "foo"
答案 0 :(得分:1)
Big-O表示法描述算法的运行时间如何随输入的大小而变化。
使用示例1,如果将N硬编码为20,则输入没有缩放。该算法实际上变为O(1)
。
示例2类似于您对示例1的直觉,除了每个循环仅运行log(n)次迭代。
在示例3中,我将其描述为在O(mn)
时间内运行(m =边数,n =顶点数),而不是O(n^2)
。
最后一个例子实际上比我第一次给它一点点细微差别(谢谢,@ Harkyl!)。
边缘由顶点分隔,因此除了运行外循环2|E|
次之外,有效地运行内循环总共|V|
次。这导致您的算法复杂度为O(|V| + 2|E|)
。常量通常在big-o表示法中被忽略,因此这被认为与O(|V| + |E|)
相同。