【问题标题】:Confusion on Bubble sort complexity对冒泡排序复杂性的困惑
【发布时间】:2016-07-12 13:52:26
【问题描述】:

how to calculate Bubble sort Time Complexity 堆栈溢出我知道冒泡排序的最坏情况的复杂性是 Big Oh = n^2

但我的困惑是它的派生方式是

大哦 = n + n - 1 + n - 2 ... + 1 = (n(n + 1))/2 = O(n²)

现在方程 (n(n + 1))/2 = O(n²) 是矛盾的。

如果我取 n=10 那么 (n*(n + 1))/2 = 55 那么它为什么等于 n² 得出的结果是 100 它实际上接近它的一半所以我们不能说它是~.

请解开我的疑惑。

【问题讨论】:

  • 你应该学习O的定义
  • 从您提出的问题中,我感觉到您不熟悉大 O 表示法。在此站点上快速搜索以获取更多信息,看看是否对您有帮助。我可以确认这个数学确实是正确的。 :-)
  • “(n*(n + 1))/2 = O(n^2) 是矛盾的。”这是错误的,并不矛盾:(n*(n + 1))/2in,不等于,O(n^2)
  • @LoneWolf 如果用户回答了您的问题,请同时接受他的回答 (Accepting Answers: How does it work?)。如果不是,请说明什么仍未得到答复,这是 StackOverflow 的一个非常重要的部分,非常感谢。

标签: java algorithm sorting big-o


【解决方案1】:

来自wikipedia

f(x) = O(g(x)) 当 x 趋于无穷大当且仅当存在一个正 常数 M 使得对于所有足够大的 x 值,绝对值f(x)的最大是M乘以g(x)的绝对值。

所以在你的例子中有这样一个常数:如果我们取M = 3,那么对于所有n>0,不等式(n*(n + 1))/2 < 3*(n^2) 成立。

此外,此定义还表示:O(n^2) = O(n^2/180) = O(n^2 + n) 等等。

【讨论】:

    【解决方案2】:

    现在方程 (n*(n + 1))/2 = O(n^2) 是矛盾的。

    不,不是。

    因为它不是一个真正的方程式。

    事实上,O(n^2) 确实是无限函数集 f(n) 的简写,每个函数都有以下属性:

    limit ( n -> infinity ) of f(n)

    (有更精确的表述方式……)

    直观地说,f(n) 是集合的成员O(n^2) 告诉我们f(n) n^2 成比例增长 因为n 得到真的 大。


    很容易证明f(n) = (n*(n + 1))/2是集合O(n^2)的成员

    非正式地,当n 对这个f(n) 变得非常大时,等式的(n^2)/2 项占主导地位,n/2 消失得无足轻重。

    【讨论】:

      【解决方案3】:

      时间复杂度的工作方式是您想找出函数在非常大的值下的行为方式。您替换 N 的值并不准确,但它是大值的近似值。例如,如果 N = 1,000,000 并且您的时间复杂度为 O(n+1),那么 1,000,000 和 1,000,001 是否不同?

      我们的想法是,您不要添加那些渐近增长最快的术语。所以在n*(n+1)/2 中,你会保留n^2,因为它增长最快。

      【讨论】:

        【解决方案4】:

        确切地说,O(...) 是一组函数,而不是一个数字。有时有些人很懒,写x = O(y)而不是x \in O(y)

        您可以在此表的正式定义列中找到集合O(y)的确切定义:https://en.wikipedia.org/wiki/Big_O_notation#Family_of_Bachmann.E2.80.93Landau_notations

        这是什么非正式的意思? O(f(x)) 包含以大致相同的速度增长的函数。
        例如,如果您有 g(x) = n^2 + 5n - 7000,那么它在 O(n^2) 中,因为 n^2 是函数的主要部分(与确切定义相比)。

        此外,常数因子也可以去除。所以,g(x) = 1000n^2 也在O(n^2) 中。

        因此,O(...) 仅指示哪些变量以及依赖于多少变量。例如,存在一个输入(它可能非常大),其中函数n^2 大于100000000 * n

        因此,时间复杂度为O(n^2) 的算法通常不如O(n) 中的算法好。但是,这非常重要,实际上它可能更可取,因为第二种算法中的隐藏内容可能很大,以至于第一种算法更适合实际出现的输入大小。但是,输入大小有一个界限(可能非常大),第二个算法会变得更好,但实际上可能不会发生。

        【讨论】:

          【解决方案5】:

          O 表示法旨在显示所需时间如何随着输入数量的增加而增长,因为输入的数量变大了。例如,假设有一段代码是 O(n)。如果我们将输入加倍,我们预计运行时间(大致)加倍。如果我们将其增加三倍,我们预计运行时间也会增加三倍。请注意,无论代码运行时的假设精确公式中可能存在任何因素,这都是正确的。

          O(n^2) 也可以这样说:加倍会导致四倍等。

          所以:

          O(n^2) == O(1/2*n^2) == O(2*n^2) == 0(1000000000*n^2)

          这是nice tutorial

          【讨论】:

            【解决方案6】:

            任何排序算法的复杂性都取决于比较。在冒泡排序中,我们已经看到总共有 N-1 次通过。在第一遍中,进行 N-1 次比较以将最高元素放置在正确的位置。然后在第 2 遍中,将第二高的元素放置在其位置。因此,要计算复杂度,我们必须计算算法所做的比较~

            使用基本离散数学~

            f(n)= (n-1)+(n-2)+(n-3)+.....+ 3 + 2 + 1

            f(n)= n(n-1)/2

            f(n)= n^2 + O(n) ~(导出复杂度时忽略常量)

            f(n)= O(n^2)

            因此冒泡排序的复杂性是 O(n^2)。这意味着执行冒泡排序所需的时间与n^2成正比,其中n是数组中的总元素。

            【讨论】:

              猜你喜欢
              • 2016-02-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多