Java:测试算法:所有可能的组合

标签 java algorithm testing

我想详尽地测试一个字符串匹配算法,命名为myAlgo(Char[] a, Char[] b)

详尽的测试包括否。不同的 char 字母,alplhabet“l”,在“n”长数组中。然后测试计算所有组合,同时将其与具有相似属性(如真值表)的另一个数组的所有组合进行比较,例如

我既无法计算生成大小为 n 的数组和字母 l 的每个组合的东西,也无法编写能够将计算组合到迭代测试用例中的代码(测试所有组合比较的两个数组),尽管使用能够生成组合的代码,制作嵌套的 for 循环应该进行所需的测试。

我的目标是通过让它计算它不应该计算的东西来打破我的算法。

Test(char[] l, int n)
    l = [a;b] //a case could be
    n = 2     //a case could be
    myAlgo([a;a],[a;a]); //loops over my algorithm in the following way
    myAlgo([a;b],[a;a]);
    myAlgo([b;a],[a;a]);
    myAlgo([b;b],[a;a]);
    myAlgo([a;a],[a;b]);
    myAlgo([a;b],[a;b]);
    myAlgo([b;a],[a;b]);
    myAlgo([b;b],[a;b]);
    myAlgo([a;a],[b;a]);
    myAlgo([a;b],[b;a]);
    ...
    myAlgo([b;b],[b;b]);

我自己的解决方案(仅适用于有限的“l”集)并且还在以后的迭代中开始打印奇怪的输出。

公开课测试{

//aux function to format chars
public static String concatChar(char [] c){
    String s = "";
    for(char cc : c){
        s += cc;
    }
    return s;
}

public static void main(String[] args) {

    String ss1 = "AA";                          //TestCases, n = 2
    String ss2 = "AA";
    char[] test1 = ss1.toCharArray();
    char[] test2 = ss2.toCharArray();
    Fordi fordi = new Fordi();                  //my algorithm
    TestGenerator tGen = new TestGenerator();   //my testGenerator
    for(int i=0; i<Math.pow(4.0, 2.0);i++){     //to test all different cases

        for(int j=0; j<Math.pow(4.0, 2.0);j++){
            int k = fordi.calculate(test1, test2);  //my algorithm
            String mys1 = concatChar(test1);        //to print result
            String mys2 = concatChar(test2);        //to print result
            System.out.println(mys1 + " - " + mys2);
            System.out.println(k);
            test2 = tGen.countArray(test2);         //"flip" one number
        }
        test2 = ss1.toCharArray();
        test1 = tGen.countArray(test1);             //"flip"
    }
}

我的 arrayflipper 代码:

public char[] countArray(char[] a){
    int i=0;
    while(i<a.length){
        switch (a[i]){
        case 'A':
            a[i]='B';
            clearBottom(a,i);
            return a;
        case 'B':
            a[i]='C';
            clearBottom(a,i);
            return a;
        case 'C':
            a[i]='D';
            clearBottom(a,i);
            return a;
        case 'D':
            i++;
            break;
        default:
            System.out.println("Something went terribly wrong!");

        }
    }
    return a;

}
public char[] clearBottom(char [] a, int i){
    while(i >0){
        i--;
        a[i] = 'A';
    }
    return a;
}

最佳答案

据我了解,您的目标是创建所有由 L 字母表中的字母组成的 n 字符长字符串(作为数组中的元素单独存储)?

实现此目的的一种方法是对字母进行排序(A=0、B=1、C=2 等)。然后,您可以从 AAA...AAA(n 个字符长)的起始字符串继续加 1。本质上,您实现了一个加法算法。加 1 会将 A=0 变成 B=1。例如,n=3 和 L=3:

开始:AAA (0,0,0)。

加1变成AAB(0,0,1)

再次加1变成AAC(0,0,2)

再次加 1(因为我们没有字母,现在我们进位)ABA (0, 1, 0)。

您可以将此过程归结为寻找最右边未达到最大值的数字并将其加 1(然后该数字右侧的所有数字都归零)。所以在字符串 ABCCC 中,B 数字是最右边的未用完的数字,它上升 1 变成 C,然后右边的所有用完的数字都回到 0(A),留下 ACAAA 作为下一个字符串。

您的算法只是重复加 1,直到字符串中的所有元素都达到最大值。

关于Java:测试算法:所有可能的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932605/

相关文章:

在应用许多操作后找到特定结果的算法

algorithm - 贝尔曼福特算法无法计算有向边加权图的最短路径

xcode - 如何让 Xcode 在测试代码出现异常时停止?

android - Google Play 应用内结算 - 测试 GetPurchases - 静态响应?

java - 按列搜索结果集

java - Android:如何计算几天前的日期?

algorithm - 组元组,使得组中的每个项目与其他成​​员不共享共同元素

unit-testing - 您如何测试特定的 Rust 错误?

java - 将编写的代码分为两个类(JAVA)

java - 为休息服务构建 Spring 安全拦截器