2009-06-09 16 views
2

私は、不確定な値の順序で順序に関係なく可能なペアを作成するアルゴリズムを試しています。不確定な値のセットで順序に関係なく可能なペアを作成します。

例えば者がセットは、B、C、D、Eである

を言わせ、次に可能なセットが

AB ACある AD AE BC CD DE

しかし...私はまた2つ以上の値のペアが欲しい。例えば

ABC ABD ABE BCD BCE

もABCD又はABCE。ここでの問題は、文字列の配列STring []を使用してメソッドを作成し、出力が2〜3のペアの文字列のリストになりたいということです。値の数-1までです。

誰かが解決策を考えている場合は、助けてください。 :)

+0

あなたはこれを言及しなかったが、私は内のインスタンスのために、あなたはセット内の各項目は、一度使用したいだけでしょう、あなたの質問から仮定セットA、B、C、D、E:AAAAは​​有効なペアリングではありませんか? –

+0

あなたはABCDEをあなたのセットの適切な要素と考えているのですか? –

+0

なぜこれをあなたのやり方と同じようにタイトル付けし、タグとして「比較」を挙げましたか?特定の文字列セットがその中にあるかどうかをテストするためにpowersetを生成していますか?もしそうなら、その情報を得るためのより効率的な人間関係があるかもしれません。 –

答えて

0

これは、最も計算量の多い作業の1つです。これは、遠隔の大きなデータセットでさえも、うまくスケールされません。

不確定なセットでは実際には実用的ではありません。生成できるペアを制限することができ、したがってこのスケールをより良くすることができます。

5

power setを作成しているようです。 This questionは本質的に同じですが、その答えを見てください。

+0

素晴らしいです!それはまさに私が探していたものです。私はちょうどスレッドの関数を作成して、与えられたより大きな値のセットから任意のセットを見つけようとする必要があります! :: D –

0

あなたが作成したいものは、入力の順列のなんらかの種類のpower setです。

Javaのiterator conceptは、無限のシーケンスを理論的に許可します。

とあなたの質問は、と比べてどうですか?

0

最も効率的ではありませんが、解決策:

import java.util.Arrays; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.Set; 

public class PowersetTest { 

public static void main(String [] args){ 
    Set<Set<String>> sets = permute(Arrays.asList("a","b","c","d","e")); 
    for (Set<String> item : sets){ 
     System.out.printf("Set: %s%n", item.toString()); 
    } 
} 
    static public <T> Set<Set<T>> permute (Collection<T> items){ 
     Set<Set<T>> result = new HashSet<Set<T>>(); 
     for (final T item : items){ 
     Set<T> subsetElements = filter(items, new Predicate<T>(){public boolean apply(T f){ return (f!=item);}}); 
     if (subsetElements.size() > 0) { 
      result.addAll(permute(subsetElements)); 
     } 
     Set<T> temp = new HashSet<T>(); 
     temp.addAll(items); 
     result.add(temp); 
     } 
     return result; 
    } 

    static public <T> Set<T> filter(Collection<T> items, Predicate<T> filter){ 
    Set<T> result = new HashSet<T>(); 
    for (T item : items){ 
     if (filter.apply(item)) { 
     result.add(item); 
     } 
    } 
    return result; 
    } 

    public interface Predicate<T>{ public boolean apply(T item); } 
} 
関連する問題