【发布时间】:2013-10-31 17:44:11
【问题描述】:
我在一个网站 (talentbuddy.co) 上发现了这个问题,它混淆了我对 Big-O 表示法的所有了解。
这是问题陈述:
给定一个整数数组,您的任务是将初始数组打印到标准输出 (stdout),但以特殊方式排序:
所有负数都在前,它们在初始数组中的相对位置不变 与正整数相同,但它们排在最后。
预期复杂度:O(N) 时间,额外内存 O(1)
示例输入: -5 2 1 -2 3
示例输出: -5 -2 2 1 3
我知道 O(n) 时间意味着算法运行时间与输入的大小成正比,在这种情况下是数组的大小,但是有额外的内存 O(1) 意味着什么?
是否可以使用单个 for 循环来解决此问题?这是我的解决方案的样子,我不确定它的运行时间是否为 O(n)。
import java.util.Arrays;
class MyClass {
public static void relative_sort(Integer[] v) {
int[] positives = new int[v.length];
int counter = 0;
for(int i=0; i < v.length; i++){
if(v[i] < 0){
System.out.print(v[i] + " ");
}else{
positives[counter] = v[i];
counter++;
}
}
for(int i=0; i < counter; i++){
System.out.print(positives[i] + " ");
}
}
}
非常感谢您的帮助!我真的很感激!
【问题讨论】:
-
您的额外内存不是
O(1),因为positives的大小是n。如果你有一个额外的静态大小数组(比如 10),它仍然是O(1)。 -
我认为你的运行时间是
X,其中O(n) <= X <= 2*O(n),你需要摆脱你的第二个循环......一切都会好起来的...... -
@EugenHalca
2n仍然是O(n)。 -
这个问题之前已经出现在 SO 上:stackoverflow.com/questions/4897280/… ... 虽然在坚持数组时,接受的答案使用 O(n^2) 时间。
-
很确定内存限制将迫使您执行多个循环,以便使用固定大小的临时空间,您可以在其中对输入的部分进行操作,而不是尝试对整个数据集进行操作。