我們可以用o(n)來解決這個問題。如果我們使用Set數據結構並考慮初始容量和,這是可能的。
public static boolean checkThreeWaySetDisjointness(Set<Integer> a, Set<Integer> b, Set<Integer> c)
{
int capacity = Math.round((a.size() + b.size())/0.75f) + 1;
Set<Integer> container = new HashSet<Integer>(capacity);
container.addAll(a);
for (int element : b)
{
if (!container.add(element))
{
if (c.contains(element))
{
return false;
}
}
}
return true;
}
我們正在創造新的一組容器,因爲如果我們開始在任何現有的一組A/B/C直接添加,一旦達到其實際尺寸的75%的容量,內部java會創造新的Hashset及複印件整個現有的Set中。這種開銷將具有O(n)的複雜性。因此,我們在這裏創建新的HashSet的大小爲容量,這將確保不會有複製的開銷。然後複製整個Set a,然後繼續添加來自Set b的一個一個元素。在Java中,如果add()返回false意味着元素已經存在於當前集合中。如果是的話,只需在第三個設置c中檢查相同。 HashSet的方法add和contains包含O(1)的複雜性,所以這整個代碼運行在O(n)中。
這些集合是否需要成對分離? – user1952500 2013-03-04 05:55:01