【问题标题】:Big Oh Notation - formal definitionBig Oh Notation - 正式定义
【发布时间】: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))?

【问题讨论】:

    标签: algorithm big-o


    【解决方案1】:

    请记住,您正在寻找“当 n 足够大时 f(n) 的上限”。因此,如果你可以证明 f(n) 对于 n 大于 N 的值小于或等于某个 cg(n),这意味着 cg(n) 是因此 f(n) 和 f(n) 的复杂度是 O(g(n))。

    给出的示例旨在表明,对于任何 n > N,给定函数 f(n) 永远不会超过 c*g(n)。通过操纵初始上限,使其可以更简单地表示(如果 4n ^2 + 50n 是 f(n) 的上限,那么 4n^2 + 50n^2 也是如此,它等于 54n^2,它成为你的 54*g(n),其中 c = 54 和 g(n) = n^2),作者可以证明 f(n) 以 c*g(n) 为界,其复杂度为 O(g(n)),因此 f(n) 也是如此。

    【讨论】:

    • 阿德里安谢谢你。通读您的解释,一切都变得更加清晰。你应该当老师!
    【解决方案2】:

    挑选号码的全部内容就是:让选号更容易。因为您可以为 N 和 c 选择任何您喜欢的数字,所以作者只选择了最容易看到的地方。这也是你可以做的(在写考试等时)。

    因此,虽然通常可以使用较小的 N,但推理会变得有点困难(通常需要一些关于分析的先前知识 - 我们都在多年前了解到,x 的增长速度不如x^2...但是你要不要写下分析证明?)

    保持简单,是消息 :-) 刚开始习惯这个有点奇怪。

    【讨论】:

    • 谢谢。我知道我可以选择任何号码。但是,在我给出的示例中,作者声称任何数字 >= 50 都会使陈述 50n = 50。50(50) 与 50(50^2) 不同,对吧?
    • 此外,在示例中的某些部分,数字似乎不知从何而来。例如:作者试图显示 4n^2 + 50n - 10 = O(n^2)。后来,他写道 4n^2 + 50n - 10
    • 1.:作者可能认为:对于n=50,50n <= 50n^250*50 <= 50*50*50 相同,在这种情况下,它是超级特别容易看到的(但你是对的当然,对于任何正数 n) 也很容易看出。
    • 2.:如果a < b - 10,那么a < b,所以你可以跳过-10。类似于在右侧添加任何正值(如 n^2)。
    • 谢谢。你说的对我来说很有道理。尤其是第一个解释。但是,我看到我们可以选择任何数字,但为什么选择 50?是否更难证明这个数字是否更低?似乎在 n >= 1 时说 50n
    【解决方案3】:
    50n <= 50n^2 for n >= 50
    

    因为如果 n 为 50,那么 50n 与 n^2 相同,因为 50*50 等于 50^2。

    n^2 替换50n 我们得到

    n^2 <= 50n^2 for n >= 50
    

    这是显而易见的。

    【讨论】:

    • 也许我误解了这本书,但我读到如果 n 是某个数字,它是 50(50^2) 而不是 50(50)。 50(50) 与 50(50^2) 不同。它从未说过要替换任何东西。
    • 这只是简单的代数。我正在使用的唯一术语是左侧的术语。我所做的只是表明50n = n^2 如果n = 50
    【解决方案4】:

    他们说 50n=50 的原因可能是如果 n 小于 1,则 n^2

    我明白为什么说 50n=50 可能看起来有点傻。但这仍然是真的。这本书没有说 50n=50;那将是错误的。

    打个比方,如果我说“我所有的兄弟姐妹都说英语”,那将是真的,即使有很多说英语的人不是我的兄弟姐妹。

    关于证明,我们可以把它分成不同的陈述。

     (1): 4n^2 + 50n - 10 <= 4n^2 + 50n  (for all n)
     (2): 4n^2 + 50n <= 4n^2 + 50n^2 (for all n>=50)  
     (3): 4n^2 + 50n^2 = 54 n^2 (for all n, including all n>=50)
     (4): Therefore, 4n^2 + 50n - 10 <= 54n^2 for all n>=50
     (5): Therefore, for f(n)=4n^2 + 50n - 10, g(n)=n^2, N=50, and c=54, 
               the statement  f(n) <= c g(n) for all n >= N is true
     (6): Therefore, by definition 4n^2 + 50n - 10=O(n^2). 
    

    应该清楚的是,这些陈述中的每一个都是真实的,无论是单独 (1,2,3),还是作为前面陈述的结果。

    【讨论】:

      【解决方案5】:

      正式定义:

      • f(n) = O(g(n)) 表示存在 c > 0 和 n0 使得对于任何 n >= n0 f(n )
      • f(n) = o(g(n)) 意味着对于任何 c > 0 存在 n0 使得对于任何 n >= n0 f( n)

      如您所见,两者略有不同:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2011-03-14
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多