简化大O表达式
- 我们省略所有常量
- 我们忽略n
的低权力 醇>
例如:
O(n + 5) = O(n)
O(n² + 6n + 7) = O(n²)
O(6n1/3 + n1/2 + 7) = O(n1/2)
我在这些例子中是对的吗?
答案 0 :(得分:4)
<强> 1。我们省略了所有常量
嗯,严格地说,你不要省略所有常数,只省略最外面的倍增常数。这意味着O(cf(n)) = O(f(n))
。添加常数也很好,因为
f(n) < f(n)+c < 2f(n)
以n
开头,O(f(n)+c) = O(f(n))
。
但是你不要在复合函数中省略常量。有时可能会完成(例如O(log(cn))
甚至O(log(n^c))
),但一般情况下都不行。例如考虑2^2n
,可能很容易将2放在O(2^n)
中,这是错误的。
<强> 2。我们忽略n
的低权力是的,但请记住,您并不总是使用多项式函数。通常可以忽略任何添加的渐近降低函数。假设您f(n)
和g(n)
,g(n) = O(f(n))
,O(f(n) + g(n)) = O(f(n))
。
你不能通过乘法来做到这一点。
答案 1 :(得分:1)
你几乎是对的。第二个规则应该是你忽略了除n
向无限大的最大限度以外的所有条件。如果您的术语不是n
的幂,如log
或其他数学函数,那么这一点非常重要。
值得注意的是,大O符号有时会掩盖重要的其他细节。 O(n log n)
的算法将比O(n^2)
的算法具有更好的性能,但前提是输入足够大,以便大多数术语能够支配运行时间。可能对于您在特定应用程序中实际需要处理的大小输入,O(n^2)
算法实际上表现更好!