簡體   English   中英

組合算法(6選2)

[英]Algorithm for combinatorics (6 choose 2)

在這個問題之后 ,我想現在編碼“6選2”次“4選2”。 我的意思是,我可以說我有6個字符“ABCDE F.” 我第一次選擇任意兩個字符來刪除。 第二次我想選擇2個不同的字母來刪除,然后我追加這兩個試驗的結果。 因此,我將收到90個(“6選2”次“4選2”)八個字符串。 模式中的字符來自相同的模式{1,2,3,4,5,6}。 所有角色都是獨一無二的,沒有重復。

這是我到目前為止所擁有的。

public String[] genDelPatterns(String design){
    char[] data = design.toCharArray();
    String[] deletionPatterns = new String[15];
    int x = 0;
    StringBuilder sb = new StringBuilder("");
    int index = 0;
    for(int i = 0; i < (6-1); i++){
        for(int j = i+1; j < 6; j++){
            for(int k= 0; k < 6; k++){
                if((k != j) && (k != i))
                    sb.append(String.valueOf(data[k]));
            }
            deletionPatterns[x++] = sb.toString();
            sb = new StringBuilder("");
        }
    }
    return deletionPatterns;
}
public String[] gen8String(String[] pattern1, String[] pattern2){
    String[] combinedPatterns = new String[225];
    int k = 0;
    for(int i = 0; i < 15; i++)
    {
        for(int j = 0; j < 15; j++)
            combinedPatterns[k++] = pattern1[i] + pattern2[j];
    }
    return combinedPatterns;
}

我將調用這樣的方法:

gen8String(genDelPatterns("143256"), genDelPatterns("254316"));

目前,我正在生成所有可能的8個字母字符串。 但是我想根據上述規范只生成8個字符串。 我真的很困惑,我怎么能優雅地做這個乘法。 我能想到的唯一方法是制作另一種方法,即“4選2”,然后組合2個字符串數組。 但這似乎非常迂回。

編輯:一個8字符串的例子就像“14322516”,給定我在調用gen8String時輸入的輸入,(143256,254316)。 請注意,前4個字符來自143256,刪除了5和6。 但是因為我在第一個路徑中刪除了5和6,所以我不再允許在第二個模式中刪除相同的東西。 因此,我從第2個模式中刪除了3和4。

你有一系列方法,每個方法都稱為變異。 為此,我的建議是使用遞歸方法! 要實現您的目標,您必須對此解決方案有一點經驗。

利用遞歸的方法的一個簡單示例:

public static long factorial(int n) { 
    if (n == 1) return 1; 
    return n * factorial(n-1); 
} 

我還建議您為方法參數傳遞對象(構造為完美),如果太復雜而無法傳遞簡單變量

在我看來,這是這個解決方案的核心。

雖然你試圖做的肯定是有效的,但似乎你正在尋找其他方法來實現它。 這是我給出小約束時會做的骨架。

// Very pseudo code
// FOR(x,y,z) := for(int x=y; x<z;x++)

string removeCharacter(string s, int banA, int banB){
     string ret = "";
     FOR(i,1,7){
         if(i != banA && i != banB){
              ret += s[i];
         }
     }
    return ret;
}

List<string> Generate(s1,s2){
    List<string> ret = new List<string>();
    FOR(i,1,7) FOR(j,i+1,7) FOR(m,1,7) FOR(n,m+1,7){
         if(m != i && m != j && n != i && n != j){
             string firstHalf  = removeCharacter(s1,i,j);
             string secondHalf = removeCharacter(s2,m,n);
             ret.Add(firstHalf + secondHalf);
         }
    }
    return ret;
}

這應該生成所有可能的8個字符的字符串。

這是我提出的解決方案。 我猜不是真的采用“數學”方法。 但它完成了這項工作。

//generating a subset of 90 eight character strings (unique deletion patterns)
    public static String[] gen8String(String[] pattern1, String[] pattern2){
        String[] combinedSubset = new String[90]; //emty array for the subset of 90 strings
        String  combinedString = ""; //string holder for each combined string
        int index = 0; //used for combinedSubset array
        int present = 0; //used to check if all 6 characters are present

        for(int i = 0; i < 15; i++){

            for(int j = 0; j < 15; j++){
                combinedString = pattern1[i] + pattern2[j]; //combine both 4 letter strings into 8 char length string
                char[] parsedString = combinedString.toCharArray(); //parse into array

                //check if all 6 characters are present
                for(int k = 1; k <= 6; k++)
                {
                    if(new String(parsedString).contains(k+"")) {
                        present++;
                    }
                    else
                        break;
                    //if all 6 are present, then add it to combined subset
                    if(present == 6)
                        combinedSubset[index++] = combinedString;
                }
                present = 0;
            }
        }
        return combinedSubset;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM