如何比较Java中两种方法的复杂性?

时间:2015-06-20 18:20:49

标签: java time-complexity space-complexity

如何比较这两种方法的O复杂度?

这是第一种方法:

protected static List<Integer> removeDuplicates1(List<Integer> source) {
    List<Integer> tmp = new ArrayList<Integer>();
    for (Integer element : source) {
        if (!tmp.contains(element)) {
            tmp.add(element);
        }
    }

    //Collections.sort(tmp);
    return tmp;
}

第二个:

protected static List<Integer> removeDuplicates2(List<Integer> source)  {
    return new ArrayList<Integer>(new HashSet<Integer>(source));
}

UPD

我不知道如何计算两种方法的O复杂度。

UPD2

好的,第一种方法的时间复杂度为O(n^2),第二种方法为O(n)。那么内存使用情况呢?谁更贪婪,为什么?

3 个答案:

答案 0 :(得分:2)

第二个是更好 class Table1 extends Model { public function table2() { return $this->...(); } public function table3() { return $this->...(); } } class Table2 extends Model { public function table1() { return $this->...(); } public function table3() { return $this->...(); } } class Table3 extends Model { public function table1() { return $this->...(); } public function table2() { return $this->...(); } } 复杂度(第一个O(n))。

首先,您将遍历循环中的列表(O(n^2)),并为每个操作运行n,然后运行tmp列表以查找元素是否存在(另外一个{ {1}})。

对于第二种方法,添加contains()的操作是不变的,实际上只有一个n

答案 1 :(得分:0)

第二种方法效果更好,因为它的复杂性为O(n),而不是O(n^2)中的第一种方法。

Big O表示法中第二个解决方案的复杂性是O(n),因为它只在List中循环一次。虽然在第一种情况下它首先用于循环运行一次,但内部包含mehtod再次在临时列表上运行。因此,这种情况下的复杂性是O(n ^ 2)。

答案 2 :(得分:0)

不要尝试在Java中执行此操作,只是尝试在伪代码中执行此操作。

在第一个问题中,你有两个整数列表;两个数字列表。如果没有给出任何其他规则,我们可以假设两个列表都是n个项目。

你一直走过其中一个列表,并为其中的每个号码做一些事情。如果有n个数字,那就是n个步骤。对于这n个步骤中的每一步,您都会说“其他列表中是否包含此编号?”

要查看列表中是否有数字,最糟糕的情况是它没有,这意味着您必须检查列表中的每个项目才能找到答案。如果第二个列表可以与第一个列表一样大,那么这也是n个步骤。

把它们放在一起: 遍历n个项目的列表,并对每个项目执行n项操作。

让我知道您的想法,我会在此之后编辑此答案。

对于您的第二个代码段,请将其拆分。

首先要做的是使用输入中的所有项创建HashSet。将一个项目插入HashSet需要多长时间?如果插入n个项目,则将单个插入的时间乘以n。

发生的第二件事是调用新的ArrayList。检查API以确定它正在做什么:     http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)

它正在使用HashSet Collection中的所有项创建一个ArrayList。插入数组列表需要多长时间?乘以项目数(n)得到答案。

由于这些是独立的步骤,因此它们是分开的。无论哪个具有更高的大O复杂性是主导的,你可以忽略另一个。如果它们都具有相同的大O复杂性,那就是答案;你可以忽略一个,因为O(2n)与O(n)的复杂度相同;常数(如2x)会掉线。