如何使用每种可能的对或错组合生成布尔数组

时间:2019-02-12 13:23:24

标签: java performance combinations

我输入了一系列数字,例如1 2 3 4,我可以将它们彼此加或减,然后指定它必须等于4。我使用布尔数组表示这两个操作:True ='+'和False ='-'。我在while循环中使用了一种方法调用,该方法调用将在布尔数组中生成true或false的每种可能组合。我的代码会生成组合来解决数字序列,但是当数字序列为15或更大时,该方法将花费很长时间,并且无法解决数字序列。

有人对我如何提高效率和解决20多个整数问题提出建议吗?

private static boolean hasNextOper(boolean[] oper) {
    for (int i = 0; i < oper.length; i++) {

        if (oper[i]) {
            oper[i] = false;
        } else {
            oper[i] = true;
            return true;
        }
    }
    return false;
}

此方法也被这样调用:

while (hasNextOper(oper)) {

        if (isTarget(oper, numbers, target, order)) {
            displayResults(oper, numbers, target, order);
            return;
        }

    }

1 个答案:

答案 0 :(得分:0)

您的hasNextOper方法似乎正在遍历这些数组值:

{false, false, true }
{false, true , false}
{false, true , true }
{true , false, false}
...

请注意,它们如何以与二进制数相同的模式变化:000、001、010,...。因此,您应该可以使用整数(long类型最多可以有64位;如果您想要更多,请使用BigInteger,但这有点复杂)。

    // Example: generate all possible combinations in an array of 20 booleans.
    final int length = 20;
    for (long n = 0; n < (1 << length); n++) {
        oper = longBitsToBoolArray(n, length);
        // ... now do things with oper
        // ...
    }

static bool[] longBitsToBoolArray(long bits, int length) {
    bool[] oper = new bool[length];
    for (int i = 0; i < length; i++)
        oper[i] = ((bits >>> i) & 1) != 0;
}