我现在处理的情况是我有一个算法,其复杂性由三个独立变量l
,m
和n
决定。该算法的一种实现在O((l + m)*log^2(l + m) + (m + n)*log^2(m + n))
时间运行,另一种在O((l + m + n)*log^2(l + m + n))
中运行。我怎样才能解释这些复杂性?哪一个会更受欢迎?一般来说,如果f
和g
是n
变量的函数,我如何确定O(f)
是否比O(g)
更渐近?
答案 0 :(得分:3)
如何判断
O(f)
是否比O(g)
更渐近?
这取决于f
和g
之间的关系,即它取决于调用者使用的实际参数。换句话说,如果不扩大其范围,就无法回答这个问题。
如果您对值的行为有隐含的了解(例如,如果值的大小必然相互关联),您可以将它们等同起来,例如将它们替换为x
。
如果该决定对您有实际意义,我建议您实施这两种算法并在实践中尝试将这些算法包含在执行时间的常数因素中。
答案 1 :(得分:1)
通常,两个功能可能是无法比拟的。可能无论常数c_1和c_2如何,对于输入的某些值,c_1f> 1。 c_2 g而对于其他输入,c_1 f< c_2 g。
对于这些特定函数,如果变量l,m和n至少为1,您的两个边界是等效的:f = O(g)和g = O(f)。
设h(x)= x log ^ 2 x。 h(l + m)+ h(m + n)在h(1 + m + n)的常数内,只要l,m,n> = 1。
不失一般性,假设n> = l,所以
m+n>=l+m
log(m+n)>=log(l+m)
log^2(m+n)>=log^2(l+m)
h(m+n) >= h(l+m)
然后我们可以使用h正在增加log为正的位置。
h(l+m)+h(m+n) <= 2 h(m+n) <= 2 h(l+m+n).
h(l+m+n) <= h((l+m)+(m+n))
<= h(2(m+n))
= 2(m+n)log^2(2(m+n))
= 2(m+n)(log 2 + log(m+n))^2
<= 2(m+n)(2log(m+n))^2
<= 8(m+n)log^2(m+n)
= 8h(m+n)
<= 8(h(l+m)+h(m+n)).
可能有更精确的估计,但这表明当l,m和n的值至少为1时,两个估计值是等价的。(当所有变量都是时,这些函数不会仅仅因常数因子而不同接近于0,所以有必要假设将l + m和m + n从0推开。)