Java 关于冒泡排序复杂性的困惑
从堆栈溢出中,我知道冒泡排序的最坏情况的复杂性是大的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,它实际上接近它的一半,所以我们不能说它是~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且您的时间
请澄清我的疑问。时间复杂性的工作方式是,您希望了解函数在非常大的值下的行为。替换的
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的一个非常关键的部分,非常感谢。