生成由一个数组定义的所有分区,其中包含另一个数组的元素

2024-03-03

我试图找到数组元素的所有分区,但有一个重要的变化:

第二个数组的每个值都需要扩展到第一个数组的值上。因此,始终使用第二个数组的所有值。

给定这两个数组:

left = [A, B];
right = [1, 2, 3];

我期望收集以下结果:

A = [1, 2, 3]
B = []

A = [1, 2]
B = [3]

A = [1, 3]
B = [2]

A = [2, 3]
B = [1]

A = [1]
B = [2, 3]

A = [2]
B = [1, 3]

A = [3]
B = [1, 2]

A = []
B = [1, 2, 3]

Edit:

所以要明确一点。这需要针对两个阵列进行扩展。

给定数组:

left = [A, B, C, D]
right = [1, 2, 3, 4, 5, 6]

一些(很多很多可能的)结果将是:

A = [2, 5]
B = [1]
C = []
D = [3, 4, 6]

A = [6]
B = []
C = [1, 2, 3, 4, 5]
D = []

etc. etc. etc.

任意参数的解(只要结果是可数的):

Edit:此版本避免了可能出现的问题len = Math.pow(left.length, right.length)以及长度超过 36 (cnr!) 的问题。

Example:

combine(['A', 'B'], [1, 2, 3])所有可能的行是2^3 = 8。在此示例中,分布是二进制的,但它使用更多参数更改了基数left.

  distribution      included in set
i       c            A           B   
----------------------------------------
0     0 0 0     { 1, 2, 3 } {         }
1     0 0 1     { 1, 2    } {       3 }
2     0 1 0     { 1,    3 } {    2    }
3     0 1 1     { 1       } {    2, 3 }
4     1 0 0     {    2, 3 } { 1       }
5     1 0 1     {    2    } { 1,    3 }
6     1 1 0     {       3 } { 1, 2    }
7     1 1 1     {         } { 1, 2, 3 }

分布i = 3 of 0 1 1评估为:

  1. 拿第一个0并将其作为 left 的索引left[0] = A并移动位值0的权利right[0] = 1来设置 A。
  2. 拿第二个1并将其作为 left 的索引left[1] = B并移动位值1的权利right[1] = 2来设置 B。
  3. 拿第三个1并将其作为 left 的索引left[1] = B并移动位值2的权利right[2] = 3来设置 B。

另一个例子:

combine(['A', 'B', 'C'], [1, 2])所有可能的行都是 3^2 = 9。

  distribution     included in set
i      c          A        B       C
----------------------------------------
0     0 0     { 1, 2 } {      } {      }
1     0 1     { 1    } {    2 } {      }
2     0 2     { 1    } {      } {    2 }
3     1 0     {    2 } { 1    } {      }
4     1 1     {      } { 1, 2 } {      }
5     1 2     {      } { 1    } {    2 }
6     2 0     {    2 } {      } { 1    }
7     2 1     {      } {    2 } { 1    }
8     2 2     {      } {      } { 1, 2 }
function combine(left, right) {

    function carry() {
        return c.reduceRight(function (r, _, i, o) {
            return r && !(o[i] = (o[i] + 1) % left.length);
        }, 1);
    }

    var c = Array.apply(null, { length: right.length }).map(function () { return 0; }),
        result = [];

    do {
        result.push(c.reduce(function (r, a, i) {
            r[left[a]].push(right[i]);
            return r;
        }, left.reduce(function (r, a) {
            r[a] = [];
            return r;
        }, {})));
    } while (!carry());
    return result;
}
document.getElementById('out').innerHTML = 
    "combine(['A', 'B'], [1, 2, 3]) = " + JSON.stringify(combine(['A', 'B'], [1, 2, 3]), null, 4) + '\n'+
    "combine(['A', 'B', 'C'], [1, 2] = " + JSON.stringify(combine(['A', 'B', 'C'], [1, 2]), null, 4) +'\n'+
    "combine(['A', 'B', 'C'], [1, 2, 3] = " + JSON.stringify(combine(['A', 'B', 'C'], [1, 2, 3]), null, 4) +'\n'+
    "combine(['A', 'B', 'C', 'D'], [1, 2, 3, 4, 5, 6]) = " + JSON.stringify(combine(['A', 'B', 'C', 'D'], [1, 2, 3, 4, 5, 6]), null, 4);
<pre id="out"></pre>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成由一个数组定义的所有分区,其中包含另一个数组的元素 的相关文章

随机推荐