如何比较这两种方法的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)
。那么内存使用情况呢?谁更贪婪,为什么?
答案 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)会掉线。