【发布时间】:2010-05-02 19:50:31
【问题描述】:
我现在正在为我的 Java III 课程阅读教科书。我们正在阅读有关 Big-Oh 的内容,但我对它的正式定义感到有些困惑。
正式定义:“一个函数 f(n) 至多为 g(n) - 即 f(n) = O(g(n)) - 如果存在正实数 c 和正整数 N使得所有 n >= N 的 f(n)
好的,这是有道理的。但是等等,继续阅读……这本书给了我这个例子:
“在第 9.14 节中,我们说过 使用 5n + 3 次操作的算法 是 O(n)。我们现在可以证明 5n + 3 = O(n) 通过使用的正式定义 大哦。
当 n >= 3 时,5n + 3 = 3,或 5n + 3 = 在)。也就是说,如果一个算法 需要的时间与 5n + 3,就是O(n)。”
好的,这对我来说很有意义。 他们说如果 n = 3 或更大,5n + 3 比 n 小于 3 花费的时间更少 - 因此 5n + n = 6n - 对吗? 有道理,因为如果 n 是 2 , 5n + 3 = 13 而 6n = 12 但当 n 为 3 或更大时,5n + 3 将始终小于或等于 6n。
这就是我感到困惑的地方。他们给了我另一个例子:
示例 2:“让我们证明 4n^2 + 50n - 10 = O(n^2)。很容易看出:4n^2 + 50n - 10
= 50, 4n^2 + 50n - 10 = 50。因此,在 c = 54 和 N = 50 的情况下,我们已经证明了 4n^2 + 50n - 10 = O(n^2)。”
此语句没有意义:50n = 50。
没有任何 n 会使 50n 小于 50n^2 吗?不只是大于等于50?为什么他们甚至提到 50n
另外,4n^2 + 50n - 10 = 50 无论 n 是多少都是正确的。
究竟如何选择数字表明 f(n) = O(g(n))?
【问题讨论】: