このクラスは、問題が発生する場所の例です。
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);
}
}
ここで、2つの可能な関数を想像してください。
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)
です。
この問題がインポートされる理由は、外部クラスがその内容を変更することを許可しない場合は、リストまたはセットを返さないように教えられているためです。コピーを返すことは明らかな解決策ですが、それは本当に時間がかかる可能性があります。