2012-01-12 11 views
3

私はWikipediaのUnion Findアルゴリズムを知っていて、それらの小さな実装を見つけることができますが、Java自身も同様のアルゴリズムをSetに使用していますか?もしそうなら、私は車輪を記録せずにJavaのセットを使用することを好むでしょう...JavaのSetはUnionFindアルゴリズムを実装していますか?

+0

disjoint-set操作を意味しますか? – orezvani

答えて

3

Javaのセットインターフェイスは、ユニオン検索構造とは全く異なる操作をサポートしているため、全く異なるユースケースに適しています。

+0

JavaにDisjoin-Setデータ構造がありますか?今では単純化したものから複合体へのHashMap を使用しています。それぞれの複合体はシンプルセットを記憶しています – propaganda

+0

@propaganda:標準APIには何もありませんが、インターネット上で実装を見つけることができます。 –

1

AFAIKいいえ、2つのセットの和集合を作成するには、一般的な方法は1つのセットをコピーして、 (または、両方のセットのすべての要素を同じセットにコピーします)。

Set<E> set1, set2; 

Set<E> union = new HashSet<E>(set1); 
union.addAll(set2); 
0

最初の回答に同意します。さらに、Set内の要素を見つけるには、containsメソッドを使用する必要があります。その署名は以下の通りです。

public boolean contains(Object o) 

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)). 

Specified by: 
    contains in interface Collection<E> 

Parameters: 
    o - element whose presence in this set is to be tested. 
Returns: 
    true if this set contains the specified element. 
Throws: 
    ClassCastException - if the type of the specified element is incompatible with this set (optional). 
    NullPointerException - if the specified element is null and this set does not support null elements (optional). 

さらに、3つのセットの実装は全く異なります。その要素をハッシュテーブルに格納するHashSetは、最も優れた実装です。反復の順序に関しては保証しません。要素を赤黒のツリーに格納するTreeSetは、値に基づいて要素を順序付けします。 HashSetよりもかなり遅いです。 LinkedHashSetは、リンクされたリストを持つハッシュテーブルとして実装され、セットに挿入された順序(挿入順序)に基づいて要素を順序付けします。 LinkedHashSetは、クライアントをHashSetによって提供される不特定の、一般的に混沌とした順序からわずかに高いコストで守ります。

関連する問題