有一个与数组相关的问题,要求是时间复杂度为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()会占用更多空间吗?
最近JDK中的Arrays.sort(int[] a)是用双支点快速排序算法实现的,该算法具有O(n log n)的平均复杂度,并且是就地执行的(例如,不需要额外的空间)。
根据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))的时间复杂度
我假设你在这里谈论的是Java。
所以循环将花费O(n)时间,我的问题是Arrays.sort()会花费更多的时间吗?
是的,数组。排序(int[])
在我所知道的所有Java标准库实现中,都是基于比较的排序的示例,因此必须具有最坏情况复杂度Ω(n logn)。特别是,Oracle Java 7对整数重载使用了双枢轴快速排序变体,这实际上是Ω(n2)最坏情况。
Arrays.sort() 会占用更多空间吗?
它很可能会使用ω(1)空间(这意味着另一个是,空间使用不是O(1))。虽然实现基于比较的排序并非不可能,只有恒定的额外空间,但它是非常不切实际的。
也就是说,在某些情况下,可以在线性时间内对特定类型的数据进行排序,例如:
具有恒定范围的输入整数(例如,如果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))?我该怎么做呢?