具有O(n)时间和额外内存O(1)的Java就地算法

时间:2013-10-31 17:44:11

标签: java big-o

我在一个网站(talentbuddy.co)上发现了这个问题,它混淆了我所知道的关于Big-O符号的一切。

以下是问题陈述:

给定一个整数数组,您的任务是打印到标准输出(stdout)初始数组,但以特殊方式排序:

所有负数首先出现,并且根据初始数组的相对位置不会改变     与正整数相同,但它们是最后的。

预期复杂性:O(N)时间,额外内存O(1)

示例输入: -5 2 1 -2 3

示例输出: -5 -2 2 1 3

我知道O(n)时间意味着算法运行时间与输入的大小成正比,在这种情况下是数组的大小,但是有多余的内存O(1)是什么意思? / p>

使用单个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] + " ");            
        }
    }
}

非常感谢你的帮助!我真的很感激!

3 个答案:

答案 0 :(得分:2)

您的解决方案是O(n)时间。在最坏的情况下,您将数组循环两次,2n仍为O(n)。但是,您的额外内存也是O(n),因为positives数组的大小为n,不符合O(1)额外内存的要求。

完全抛弃positives数组,然后简单地遍历数组两次。在第一次打印时,打印底片,在第二次打印时打印正片。这仍是2n时间O(n),额外内存为O(1)

答案 1 :(得分:1)

额外内存约束意味着您需要使用的任何其他内存必须是常量因子。也就是说,x的空间需要x个字节,其中某个值不依赖于输入的大小。

当然,它提到额外的内存,因为数据的大小将与其自身成比例,因此它指的是您在阵列本身之外的操作所使用的任何额外(临时?)空间。

在您的解决方案中,您使用的数组positives与输入数据成比例。这显然是O(n)额外的内存,因此不适合你的约束。

答案 2 :(得分:0)

虽然你可以使用两个循环,但只需摆脱正数组。而只是使用与第一个循环相似的逻辑

class MyClass {
public static void relative_sort(Integer[] v) {
    for(int i=0; i < v.length; i++){
        if(v[i] < 0)
            System.out.print(v[i] + " ");   
    }
    for(int i=0; i < v.length; i++){
        if(v[i] >= 0)
            System.out.print(v[i] + " ");   
    }

}
}

复杂性为O(N),您甚至不需要额外的常量内存O(1)