关于冒泡排序复杂性的困惑

时间:2016-07-12 13:52:26

标签: java algorithm sorting big-o

从堆栈溢出的how to calculate Bubble sort Time Complexity开始,我知道最糟糕的冒泡排序的复杂性是大哦= 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 2,它实际上接近它的一半,所以我们不能说它是〜

请清楚我的怀疑。

6 个答案:

答案 0 :(得分:3)

来自wikipedia

  

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

所以在你的exaple中有这样的常数:如果我们采用M = 3然后对所有n>0采用不等式(n*(n + 1))/2 < 3*(n^2)

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

答案 1 :(得分:2)

  

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

不,不是。

因为它不是一个等式。

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

  

对于某些常数C,f(n)&lt; = C * n ^ 2 ...的极限(n - >无穷大)。

(有更精确的说明方式......)

直观地,f(n)是该集O(n^2)的成员告诉我们f(n) n^2成比例增长为{{1}让真的大。

很容易证明n是集合f(n) = (n*(n + 1))/2

的成员

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

答案 2 :(得分:0)

时间复杂性的工作方式是您希望找到函数在非常大的值下的行为方式。您替换SCREEN_WIDTH的值不准确,但它将是大值的近似值。例如,如果N = 1,000,000而您的时间复杂度为N,则1,000,000和1,000,001不同?

这个想法是你保持这个术语不被渐近增长最快的那个。因此,在O(n+1)中,您将保留n*(n+1)/2,因为它增长最快。

答案 3 :(得分:0)

O-notation旨在表明随着输入数量的增加,所需的时间随着输入的数量而增长。例如,假设一些代码是O(n)。如果我们将输入加倍,我们预计运行时间会(大致)加倍。如果我们将它增加三倍,我们预计运行时间也会增加三倍。请注意,无论代码运行时的假设精确公式中是否存在任何因素,情况都是如此。

类似的可以说O(n ^ 2):加倍会导致四倍等等。

所以:

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

这是nice tutorial

答案 4 :(得分:0)

准确地说,var events = [ {start:'2016-05-29', end:'2016-06-01', title:'Mrs A N Human',}, {start:'2016-08-10', end:'2016-08-17', title:'Mr A Person',} ]; 是一组函数,而不是数字。有时候有些人很懒,写O(...)代替x = O(y)

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

这非正式意味着什么? O(y)包含以大致相同的速度成长的功能 例如,如果您有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)中那么好。但是,这非常重要,在实践中它可能是优选的,因为第二算法中的隐藏内容可能如此之大以至于第一算法对于在实践中出现的输入大小更好。但是,输入大小(可能非常大)有一个限制,第二个算法会变得更好,但实际上它们可能不会出现。

答案 5 :(得分:0)

任何排序算法的复杂性取决于比较。在冒泡排序中,我们看到总共有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是数组中的总元素。