Java中设置的时间复杂度

时间:2011-07-20 22:56:24

标签: java time-complexity

有人可以告诉我下面代码的时间复杂度吗?

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}}方法。

任何人都可以确认并解释上述代码的时间复杂性是什么?还需要多少空间?

1 个答案:

答案 0 :(得分:20)

我相信它的O(n)因为你遍历数组,而containsadd应该是恒定时间,因为它是基于 hash 的集合。如果它不是基于散列的并且需要在整个集合上进行迭代来进行查找,则上限将是n ^ 2.

整数是不可变的,因此空间复杂度为2n,我认为这简化为n,因为常数无关紧要。

如果数组中有对象并设置,那么你将有2n个引用和n个对象,因此你处于3n,这仍然是线性的(乘以常数)空间约束。

EDIT-- yep“这个类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。”

请参阅here