为什么冒泡时间复杂度被称为n平方?

时间:2017-10-13 10:45:24

标签: c time-complexity big-o bubble-sort

关于冒泡排序时间复杂性还存在其他问题,但这个问题有所不同。每个人都说泡沫排序最坏的情况是O(n ^ 2)。在列表迭代之后的冒泡排序中,列表的最后i个元素是有序的,不需要再次触摸或比较。如果你不必要地一次又一次地遍历最终元素,时间复杂度将只是O(n ^ 2)。

鉴于冒泡排序的一个主要特征是后面的元素(输入大小减去迭代)永远不需要再次进行比较,因为它在正确的位置,为什么冒泡排序时间复杂度被认为是那个对我来说,我没想到泡泡排序?即使在维基百科中它也说时间复杂度为O(n ^ 2),然后只有文章的一半,它提到可以通过不必要地比较最后的i元素来“优化”它以仅占用大约50%的时间。

我被提醒了这一点,因为我正在制作一个循环来检查世界上所有物体的碰撞,模式是我检查的:

for (int i = 0; i < numberofobjects - 1; i++)
{
   {
      for (int iplusone = i + 1; iplusone < numberofobjects; iplusone++)
        // check collision between i and iplusone
   }
}

对于400个对象,O(n ^ 2)的时间复杂度将为400 * 400 = 160,000。然而,它仅进行了79,800次比较,大约50%,这正是维基百科所说的。这让我想起了泡泡的种类,所以当我检查时,我很惊讶地看到每个人都说它是O(n ^ 2)。

这是否意味着每当有人提到冒泡排序时,他们指的是对已经排序的最终元素不必要地重申的版本?此外,当比较不同的算法时,冒泡排序总是变得更糟,但作者是指明显不好的n ^ 2版本吗?

1 个答案:

答案 0 :(得分:2)

  

对于400个对象,O(n ^ 2)的时间复杂度将为400 * 400 = 160,000。然而,它只进行了79,800次比较,大约50%

是的,你对79,800的比较是正确的,但是你没有得到很好的O符号。

首先,如果您仔细查看冒泡排序算法,您会发现确切的步骤比较是:

n-1 + n-2 + ... + 1 = n(n-1)/2 exactly

这意味着当n = 400时,你会得到正好400 * 399/2 = 79,800次比较

虽然大O符号告诉您总步数为:n(n-1)/2 = n^2/2 - n/2并且在大O符号中我们忽略低阶词和常量,我们只保留n^2所以它是O(n^2)

你需要理解的是,大O符号并没有告诉你它只是告诉你一个上限的确切步骤,例如复杂度函数的高阶,这是n的大值。它只是声明 "for big n the complexity-order of growth is c*n^2" - 它描述了当参数趋向特定值或无穷大时函数的限制行为。