1

以下を計算するには、Java で記述されたアルゴリズムが必要です。

集合 S = {s1,s2,...,sn} が与えられ、n 個の要素が型を表し、集合 s1_alternatives ={s1a,s1b,...,s1z} 、s2_alternatives ={s2a,s2b,...,s2z} ,..., sn_alternatives = {sna,snb,...,snz},

要素をセット s1_alternatives、s2_alternatives、...、sn_alternatives の代替要素で置き換えることにより、セット S セットのすべての可能な組み合わせを計算します。

例: S = {a,b,c} と代替案のセット a_alternatives = {a1,a2,a3}、b_alternatives = {b1,b2}、c_alternatives = {c1,c2} が与えられた場合。S の要素とその代替要素の可能な組み合わせは、S_ALTERNATIVES = {{a1,b1,c1},{a2,b1,c1},{a3,b1,c2},...} です。

任意のサイズの任意のセット (任意のオブジェクト タイプで、文字列に限定されない) に適用できる Java で記述されたソリューションを探しています。

このコードを試してみましたが、適切な場所での再帰のための適切な停止条件が必要です。12 の組み合わせセットのうち 5 つしか得られません!:

組み合わせ: すべての組み合わせを構築する必要があるセット

type2Words: すべての代替代替

getType: 特定の要素の型を与える

結果: すべての組み合わせの可能なセット

void calculateAllCombinations(Set<String> combination,
Map<String, Set<String>> type2Words, Map<String,String> getType,
Set<Set<String>>result)
{   
  Set<String> wordOfStartCombination = new HashSet<String>(combination);

  for(String wordPlaceHolder:wordOfStartCombination)
  {
     String type = getType.get(wordPlaceHolder);
     Set<String> allWithThisType = type2Words.get(type);

     for(String thisType:allWithThisType)
     {
        Set<String> wordTemp = new HashSet<String>(combination);
        wordTemp.remove(wordPlaceHolder);
        wordTemp.add(thisType);
        result.add(wordTemp);
        if(!result.contains(wordTemp))
           calculateAllCombinations(wordTemp,type2Words,getType,result);
     }          
   }
 }

public static void main(String args[])
{
    Set<String> startCombination = new HashSet<String>();
    startCombination.add("a1");startCombination.add("b1"); startCombination.add("c1");


    Map<String,String> getType = new HashMap<String, String>();
    getType.put("a1", "type_a");
    getType.put("a2", "type_a");
    getType.put("a3", "type_a");
    getType.put("b1", "type_b");
    getType.put("b2", "type_b");
    getType.put("c1", "type_c");
    getType.put("c2", "type_c");
    Map<String,Set<String>> type2Word = new HashMap<String, Set<String>>();

    Set<String> typedSet1 = new HashSet<String>();
    typedSet1.add("a1");typedSet1.add("a2");typedSet1.add("a3");type2Word.put("type_a", typedSet1);

    Set<String> typedSet2 = new HashSet<String>();
    typedSet2.add("b1");typedSet2.add("b2");type2Word.put("type_b", typedSet2);

    Set<String> typedSet3 = new HashSet<String>();
    typedSet3.add("c1");typedSet3.add("c2");type2Word.put("type_c", typedSet3);

    Set<Set<String>> result = new HashSet<Set<String>>();
    result.add(startCombination);   

    calculateAllCombinations(startCombination,type2Word,getType,result);
    for(Set<String> word:result)
        System.out.println(word);
}   
4

0 に答える 0