创建阵列的所有组合

时间:2017-04-29 21:09:29

标签: c# algorithm

我正在使用C#。

我试图创建一种强力键。 我需要创建3个键,如下所示:

([0-2,1-255,1-300],[0-2,1-255,1-300],[0-2,1-255,1-300])

要尝试解密我的消息,如果它不正确以保留到下一个键,I.e:

第一把钥匙:([0,1,1],[0,1,1],[0,1,1]) 第二个关键:([0,1,1],[0,1,1],[0,1,2])

创建密钥的最佳方法是什么?因为我尝试过的任何东西都不适合我。

这是我的密钥的结构:

struct Key
{
    public byte code;
    public byte param;
    public uint len;
};

谢谢!

1 个答案:

答案 0 :(得分:2)

蛮力方法是使用9个嵌套循环。 9个嵌套的循环很难看。由于这三个键具有相同的结构,因此您可以创建一个包含一个键的所有可能组合的数组(3 x 255 x 300 = 229500)。这不是太大。然后使用三个嵌套循环,在此数组中选择3个键。 Adavantage:你只需要创建一次密钥;这加快了检查3个键的组合。

const int N = 3 * 255 * 300;

// Create the keys
var keys = new Key[N];
int i = 0;
for (byte c = 0; c <= 2; c++) {
    for (int p = 1; p <= 255; p++) { // int because byte overflows after last loop.
        for (uint l = 1; l <= 300; l++) {
            keys[i++] = new Key { code = c, param = (byte)p, len = l };
        }
    }
}

// Select 3 keys
for (i = 0; i < N; i++) {
    Key k1 = keys[i];
    for (int j = 0; j < N; j++) {
        Key k2 = keys[j];
        for (int k = 0; k < N; k++) {
            Key k3 = keys[k];
            // Do something with k1, k2, k3
        }
    }
}

请注意,如果我们将p声明为byte,那么应该是最后一个循环,p255,它会再次递增并变为{{1} (因为[0 ... 255]是0)的范围。因此,循环永远不会终止。

由于229500 3 ≈1.2* 10 16 (美国系统中12个四分之一)组合,它可能会持续几个月直到程序结束!看看How to: Write a Simple Parallel.For Loop

覆盖结构byte中的ToString只需要调试。

Key