Will Arrays.sort() increase time complexity and space time complexity?
存在与阵列相关的问题,要求时间复杂度为O(n),空间复杂度为O(1)。
如果我使用Arrays.sort(arr),并使用一个for循环到一个循环,例如:
1 2 3 4 5 6
| public static int hello (int[]A ){
Arrays. sort(A );
for(int i =0;i <A. length;i ++){
....................
}
return .... ; |
}
因此,循环将花费O(n)时间。 我的问题是:Arrays.sort()会花费更多时间吗? 如果使用Arrays.sort(),则此时间复杂度是否仍为O(n)? 并且Arrays.sort()会占用更多空间吗?
-
这没有指定使用的排序算法,所以我看不出它是如何回答的。
-
@RobertHarvey:除非有人假设Arrays.sort()使用某种魔术,否则我认为关于其具有的最小时间复杂度的问题是可以回答的,不是吗?
-
它指定Arrays.sort,因此无论使用哪种算法。很难分辨这是什么语言(猜测Java),但是标准库排序几乎总是比较排序。
-
@aminy:这是什么编程语言?
-
它肯定是java。
-
只是有点抬头。如果要O(n)时间和O(1)空间,请不要使用sort。现在,世界上没有任何排序实现在O(n)时间和O(1)空间中进行。
-
尽管在下面的答案部分中进行了所有细述,但您对实际问题的答案是肯定的:在平均情况下,排序将花费比O(n)长的时间。
-
假设您对big-O的复杂性了解得足够多,那么您真的应该问" x1的时间和空间复杂度是多少?",这确实是一个没有任何研究工作的问题,因为这已被充分证明。
我假设您在这里谈论Java。
So the loop will cost O(n) time, my question is that will Arrays.sort() cost more time?
是的,我所知道的所有Java标准库实现中的Arrays.sort(int[])都是基于比较的排序的示例,因此必须具有最坏情况的复杂度Ω(n log n)。特别是,Oracle Java 7对整数重载使用了双数据点快速排序变体,实际上这是Ω(n2)最坏的情况。
and will Arrays.sort() cost more space?
它极有可能会使用ω(1)空间(这意味着另一个是,空间使用量不是O(1))。虽然只用恒定的额外空间来实现基于比较的排序并不是不可能的,但这是非常不切实际的。
也就是说,在某些情况下,可以在线性时间内对特定类型的数据进行排序,例如:
-
http://en.wikipedia.org/wiki/Counting_sort
-
http://en.wikipedia.org/wiki/Pigeonhole_sort
-
http://en.wikipedia.org/wiki/Radix_sort
对于恒定的输入整数范围(例如,如果abs(A[i]) <= C对于某个常数C),则计数排序和基数排序实际上仅使用O(n)时间和O(1)空间,因此这可能很有用。
-
根据文档,theta(n log n)的时间不正确,theta(1)的空间不正确。我的帖子有来自文档的信息。
-
@theSilentOne我不知道您在说什么,但我不认为您知道Ω的含义
-
这意味着下限。根据文档,n log n不是下限。
-
@theSilentOne是的。抱歉,您在这方面错了。没错,它可以在特定输入类别的O(n)中工作,但最坏的情况是Ω(n log n)
-
"此实现是一种稳定的,自适应的,迭代的合并排序,当对输入数组进行部分排序时,所需的比较远远少于n lg(n)个比较,而当对输入数组进行随机排序时,它提供了传统合并排序的性能。如果输入数组几乎排序,实现需要大约n个比较",从而使n为下限。
-
@theSilentOne您显然不了解渐近的复杂性。我不会再与您讨论这个问题。
-
甚至第一句话也使n lg(n)的下限不正确。
-
如果我错了,请纠正我,但是说排序具有恒定空间的下限并不是特别有意义-适用于每个算法。
-
@Dukeling对不起,我的意思是那里的小欧米茄。固定
-
尼古拉斯(Niklas)为您带来我错了的疑问的好处,我再次回顾了Omega表示法,并希望分享发现的内容。如果我们说f(n)=Ω(g(n)),则意味着对于某个常数c> 0且所有n都足够大,f(n)≥cg(n)。在我们的讨论中,f(n)是timsort的复杂度,而g(n)是nlgn。您的陈述"Ω(n log n)"将暗示timsort始终比nlogn花费更多,这显然是从文档中得出的错误。
-
@theSilentOne渐进复杂度Ω(n log n)会暗示算法O(n)中没有适用于该算法的输入族是错误的。这意味着存在一个常数c,因此对于所有n0,都有一个大小为n> = n0的实例I,其f(I)> = c n * log n。顺便说一下,Timsort甚至不用于int []数组
-
+1有道理。
根据Arrays.sort()方法的java jvm 8 javadocs:
排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch编写的Dual-Pivot Quicksort。该算法可在许多数据集上提供O(n log(n))性能,从而导致其他快速排序降级为二次性能,并且通常比传统的(单轴)Quicksort实现要快。
因此,它将使您的时间复杂度从O(n)增加到O(n log(n))
它超过O(n)时间,并且需要超过O(1)空间。
Arrays.sort()在1.7中使用了经过改进的Timsort,这是一种相对较新开发的排序算法,它提供了复杂度为x的排序,其中O(n)
-
您还没有完全说服我,我的陈述"根本没有任何意义",因为我很确定它们确实如此,但是您的评论鼓励我再次回顾我的渐近复杂性。
-
@NiklasB。,我肯定会告诉你这是"最快的排序",这是不正确的。我最近读了一篇有关它的文章,它在许多情况下比quicksort或mergesort表现更好,因此,"最快"似乎不合适。我相信您可能比我对渐进复杂性主题有更好的理解,但是我知道我的评论对任何非PhD软件工程师都是有意义的,并且根据Java文档的说法是正确的。
-
@theSilentOne让我们留在那个朋友那里,不要难过
-
@NiklasB。谢谢你,先生。我删除了我幼稚的downvote以及卑鄙的笑容
-
在Java中,Arrays.sort(int[] a)标准实现使用快速排序,而不是Timsort。由于基于对象的搜索稳定,因此可以进行搜索。参考:docs.oracle.com/javase/7/docs/api/java/util/和docs.oracle.com/javase/7/docs/api/java/util/。在Java中,必须稳定执行对象数组的排序。
-
@CahitGungor,仅对原语进行操作的Arrays.sort重载使用QuickSort。在对象上操作的重载使用改编"来自Tim Peterss的Python列表排序(TimSort)"
最近的JDK中的Arrays.sort(int [] a)是通过Dual-pivot Quicksort算法实现的,该算法的平均复杂度为O(n log n),并且可以就地执行(例如,不需要额外的空间)。
-
实际上,它至少需要Ω(log n)的额外空间
-
哦,您可能是指执行堆栈空??间。当时您是对的,但我想问题是关于堆空间的。