Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于冒泡排序复杂性的困惑_Java_Algorithm_Sorting_Big O - Fatal编程技术网

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

Java 关于冒泡排序复杂性的困惑,java,algorithm,sorting,big-o,Java,Algorithm,Sorting,Big O,从堆栈溢出中,我知道冒泡排序的最坏情况的复杂性是大的Oh=n^2 但我的困惑在于它的推导方式 大Oh=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,它实际上接近它的一半,所以我们不能说它是~ 请澄清我的疑问。时间复杂性的工作方式是,您希望了解函数在非常大的值下的行为。替换的N值可能不精确,但它是大值的近似值。例如,如果N=1000000且您的时间

从堆栈溢出中,我知道冒泡排序的最坏情况的复杂性是大的Oh=n^2

但我的困惑在于它的推导方式

大Oh=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,它实际上接近它的一半,所以我们不能说它是~


请澄清我的疑问。

时间复杂性的工作方式是,您希望了解函数在非常大的值下的行为。替换的
N
值可能不精确,但它是大值的近似值。例如,如果N=1000000且您的时间复杂度为
O(N+1)
,1000000和1000001是否不同

这样做的目的是为了避免被添加的项以最快的速度渐近增长。因此,在
n*(n+1)/2
中,您将保留
n^2
,因为它增长最快

来自:

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

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


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

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

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

因此:

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

这里有一个。

准确地说,
O(…)
是一组函数,而不是一个数字。有时有些人很懒,在O(y)中写
x=O(y)
而不是
x\n

您可以在下表的“形式定义”列中找到集合
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)
的算法不如
O(n)
中的算法好。但是,这一点非常重要,在实践中可能更可取,因为第二种算法中隐藏的内容可能非常大,以至于第一种算法对于实际中出现的输入大小更为合适。然而,在输入大小上有一个界限(它可能非常大),第二种算法将变得更好,但在实践中可能不会出现

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

不,不是

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

事实上,
O(n^2)
实际上是无限函数集
f(n)
的缩写,每个函数都具有以下特性:


f(n)的极限(n->无穷大)任何排序算法的复杂性都取决于比较。在气泡排序中,我们已经看到总共有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是数组中的总元素。

您应该了解OFrom的定义您要问的问题我感觉您不熟悉大O符号。在这个网站上快速搜索更多信息,看看这是否对你有帮助。我可以确认这个数学确实是正确的。:-)“(n*(n+1))/2=O(n^2)是矛盾的。”这是错误的,不是矛盾的:
(n*(n+1))/2
在,不等于,
O(n^2)
@LoneWolf如果用户回答了你的问题,请也接受他的回答()。如果没有,请说明还有什么问题没有回答,这是StackOverflow的一个非常关键的部分,非常感谢。