想像一下T 1 (n)和T 2 (n)是P 1 和P 2 程序和
T 1 (n)∈O(f(n))
T 2 (n)∈O(g(n))
当P 1 沿着P <侧运行时,T 1 (n)+ T 2 (n)的数量是多少? sub> 2 ?
答案是O(max{f(n), g(n)})
,为什么?
答案 0 :(得分:2)
当我们考虑Big-O表示法时,通常会考虑算法在输入n
的大小变得很大时的作用。很多时候,我们可以依靠数学直觉。考虑两个函数,一个是O(n^2)
,另一个是O(n)
。随着n
的变大,两种算法都无限制地增加。区别在于O(n^2)
算法的增长速度比O(n)
快得多。事实上,实际上,如果您将算法组合成O(n^2+n)
,那么n
本身的因数非常小,可以忽略不计,并且该算法仍在类中O(n^2)
。
这就是为什么将两种算法加在一起时,合并的运行时间在O(max{f(n), g(n)})
中。总是有一个“主导”运行时的系统,而使另一个系统的影响可以忽略不计。
答案 1 :(得分:1)
答案是O(max {f(n),g(n)})
仅当程序彼此独立运行时,这才是正确的。无论如何,让我们假设是这种情况。
为了回答为什么,我们需要仔细研究 BIG-O-notation 的含义。与您所说的相反,它不代表时间,而是复杂度的上限。
因此,虽然同时运行两个程序可能会花费更多时间,但复杂性的上限不会增加。
请考虑一个示例:P_1计算向量中所有n对数字的乘积,它是使用嵌套循环实现的,因此复杂度为O(n*n)
。 P_2仅在一个循环中打印数字,因此复杂度为O(n)
。
现在,如果我们同时运行两个程序,则P_1的嵌套循环是最'complex'部分,使组合的复杂度为O(n*n)