存在与数组相关的问题,要求时间复杂度为O(n),空间复杂度为O(1)。
如果我使用Arrays.sort(arr)
,并使用for
循环进行一次传递循环,例如:
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()
会花费更多空间吗?
答案 0 :(得分:20)
我假设你在这里谈论Java。
在我知道的所有Java标准库实现中,因此循环将花费O(n)时间,我的问题是Arrays.sort()会花费更多时间吗?
是,Arrays.sort(int[])
是基于比较的排序的示例,因此must have worst-case complexity Ω(n log n)。特别是,Oracle Java 7对整数重载使用双枢轴快速排序变量,实际上有一个Ω(n 2 )最坏情况。
并且Arrays.sort()会占用更多空间吗?
很可能它会使用ω(1)空间(这意味着另一个是,空间使用不是O(1))。虽然实现基于比较的排序并非不可能只有恒定的额外空间,但这是非常不切实际的。
也就是说,在某些情况下,可以按线性时间对特定类型的数据进行排序,例如:
具有恒定范围的输入整数(例如,对于某些常量C,如果abs(A[i]) <= C
),那么计算排序和基数排序确实只使用O(n)时间和O(1)空间,因此可能是是有用的。
答案 1 :(得分:2)
超过O(n)时间并且需要超过O(1)空间。
Arrays.sort()利用1.7中的修改后的Timsort,这是一种相对最近开发的排序算法,它提供了复杂度x的排序,其中O(n)<0。 x&lt; O(nlgn)和O(n / 2)的空间
答案 2 :(得分:1)
最近JDK中的Arrays.sort(int [] a)是使用双枢轴Quicksort算法实现的,该算法具有O(n log n)平均复杂度并且就地执行(例如,不需要额外的空间)。
答案 3 :(得分: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))
答案 4 :(得分:0)
既然你是用Java语言谈论它,时间复杂度肯定会从O(n)增加到O(nlogn)。那是因为在 Java 8 中, Arrays.sort() 是在 Dual-pivot quicksort 算法中实现的,而不是 single pivot 。所以需要额外的时间。 而 O(1) 的空间复杂度是不可能的,因为它需要更多的空间,我猜是 O(n/2)。