此类是出现问题的示例:
public class ContainsSet {
private static HashSet<E> myHashSet;
[...]
public static Set<E> getMyHashSet() {
return new HashSet<E>(myHashSet);
}
public static boolean doesMyHashSetContain(E e) {
return myHashSet.contains(e);
}
}
现在想象两个可能的功能:
boolean method1() {
return ContainsSet.getMyHashSet().contains(someE);
}
boolean method2() {
return ContainsSet.doesMyHashSetContain(someE);
}
现在是我的问题,方法 1 在 Java 优化后是否具有与方法 2 相同的时间复杂度。(我使用HashSet
而不是仅仅Set
强调myHashSet.contains(someE)
具有复杂性O(1)
。)
没有优化就不会。虽然.contains()
有复杂性O(1)
,但new HashSet<E>(myHashSet)
有复杂性O(n)
,这会给方法1带来复杂性O(n) + O(1) = O(n)
,这与心爱的人相比是可怕的O(1)
。
导入此问题的原因是,如果您不允许外部类更改其内容,我被教导不要返回列表或集合。退回副本是一个显而易见的解决方案,但它可能非常耗时。