当前位置: 首页 > 知识库问答 >
问题:

Arrays.sort() 会增加时间复杂性和时空复杂性吗?

龚星洲
2023-03-14

有一个与数组相关的问题,要求是时间复杂度为O(n),空间复杂度为O(1)。

如果我使用< code>Arrays.sort(arr),并使用< code>for循环进行一次循环,例如:

public static int hello(int[]A){
  Arrays.sort(A);
  for(int i=0;i<A.length;i++){
     ....................
  }
  return ....;

}

所以循环将花费O(n)时间。我的问题是:< code>Arrays.sort()会花费更多时间吗?如果我使用< code>Arrays.sort(),这个时间复杂度还是O(n)吗?< code>Arrays.sort()会占用更多空间吗?

共有3个答案

连昊天
2023-03-14

最近JDK中的Arrays.sort(int[] a)是用双支点快速排序算法实现的,该算法具有O(n log n)的平均复杂度,并且是就地执行的(例如,不需要额外的空间)。

沃楷
2023-03-14

根据java jvm 8 javadocs的Arrays.sort()方法:

排序算法是Vladimir Yaroslavskiy、Jon Bentley和Joshua Bloch的Dual-Pivot Quick排序。该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统的(one-pivot)Quick排序实现更快。

因此,它将增加从O(n)到O(n log(n))的时间复杂度

杜志
2023-03-14

我假设你在这里谈论的是Java。

所以循环将花费O(n)时间,我的问题是Arrays.sort()会花费更多的时间吗?

是的,数组。排序(int[])在我所知道的所有Java标准库实现中,都是基于比较的排序的示例,因此必须具有最坏情况复杂度Ω(n logn)。特别是,Oracle Java 7对整数重载使用了双枢轴快速排序变体,这实际上是Ω(n2)最坏情况。

Arrays.sort() 会占用更多空间吗?

它很可能会使用ω(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])

 类似资料:
  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 给定一个非空字符串s和一个包含非空单词列表的字典字词,确定s是否可以被分割成一个或多个字典单词的空格分隔序列。您可以假定字典不包含重复的单词。 例如,给定s=“leetcode”,dict=[“leet”,“code”]。 返回true,因为“leetcode”可以分段为“leetcode”。 朴素解给出如下: 时间复杂度被列为O(n^n),因为这是递归树的大小。我完全同意递归树的最后一层有n^n

  • 我一直在尝试Codility.com的编码挑战,这是我尝试的问题之一: 给出一个由 N 个整数组成的非空零索引数组 A。一对整数 (P, Q),使得 0 ≤ P 例如,数组A如下: 包含以下示例切片: 切片 (1, 2),其平均值为 (2 2) / 2 = 2;切片 (3, 4),其平均值为 (5 1) / 2 = 3;切片 (1, 4),其平均值为 (2 2 5 1) / 4 = 2.5。目标是

  • 顺便说一句,我试图解决时间复杂性,我找到了O(2^n)。正确吗?

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

  • 我找不到关于它的任何信息,所以我希望你能帮助我。问题是关于for循环中嵌套的else-ifs和时间复杂度计算。 我拥有的一般代码是: 若为O(1),则每个(___)都是复杂度。我遇到的问题是,由于else和嵌套的if-else,我一直对如何计算非简化的big-O复杂度感到困惑。是O(n*1 1 1 1)吗?或者可能是O(n*1 1*(1 1))?我该怎么做呢?