有人可以告诉我下面代码的时间复杂度吗?
a
是一个int数组。
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < a.length; i++) {
if (set.contains(arr[i])) {
System.out.println("Hello");
}
set.add(arr[i]);
}
我认为它是 O(n),但我不确定它是否正在使用Set
,这也包含方法。它还调用add
的{{1}}方法。
任何人都可以确认并解释上述代码的时间复杂性是什么?还需要多少空间?
答案 0 :(得分:20)
我相信它的O(n)因为你遍历数组,而contains
和add
应该是恒定时间,因为它是基于 hash 的集合。如果它不是基于散列的并且需要在整个集合上进行迭代来进行查找,则上限将是n ^ 2.
整数是不可变的,因此空间复杂度为2n,我认为这简化为n,因为常数无关紧要。
如果数组中有对象并设置,那么你将有2n个引用和n个对象,因此你处于3n,这仍然是线性的(乘以常数)空间约束。
EDIT-- yep“这个类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。”
请参阅here。