当前位置: 首页 > 知识库问答 >
问题:

将数组(元素组合)划分为自定义分区的所有方法

唐珂
2023-03-14

我想将n个元素的数组划分为给定大小的子数组,并使用所有可能的元素组合。

例如:

等等。正如您所看到的,子数组中元素的顺序或子数组中子数组的顺序并不重要。它必须是输入数组子数组的最小数目。

我有下面的解决方案,但它也包括排列。我需要优化这一点,不产生任何排列在所有。JavaScript不是necesarry,任何语言都可以。提前感谢您的帮助。

function getN(n, array, subsets) {
    var f,
        l = array.length,
        indices = [],
        temp;

    array = array.slice();
    while (l--) {
        f = factorial(l);
        indices.push(Math.floor(n / f));
        n %= f;
    }
    temp = indices.map(i => array.splice(i, 1)[0]);
    return subsets
        ? subsets.map((i => l => temp.slice(i, i += l))(0))
        : temp;


}

function factorial(num) {
    var result = 1;
    while (num) {
        result *= num;
        num--;
    }
    return result;
}

var i, l,
    array = ['1', '2', '3', '4'],
    subsets = [2, 2],
    pre = document.getElementById('out');

for (i = 0, l = factorial(array.length); i < l; i++) {
    pre.innerHTML += i.toString().padStart(4) +': ' + JSON.stringify(getN(i, array, subsets)) + '\n';
}
<pre id="out"></pre>

共有1个答案

孟自强
2023-03-14

下面是一个递归公式,它将枚举实际元素的组合。在[2,2]列表中,每个2都被视为不同的元素。我们可以输入任意模式,如[1,2,3,4,5,6],将其分为所有与模式[[x],[x,x],[x,x,x]]的组合。

function f(ns, subs){
  if (ns.length != subs.reduce((a,b) => a+b))
    throw new Error('Subset cardinality mismatch');

  function g(i, _subs){
    if (i == ns.length)
      return [_subs];

    let res = [];
    const cardinalities = new Set();

    function h(j){
      let temp = _subs.map(x => x.slice());
      temp[j].push(ns[i]);
      res = res.concat(g(i + 1, temp));
    }

    for (let j=0; j<subs.length; j++){
      if (!_subs[j].length && !cardinalities.has(subs[j])){
        h(j);
        cardinalities.add(subs[j]);

      } else if (_subs[j].length && _subs[j].length < subs[j]){
        h(j);
      }
    }
    return res;
  }
  let _subs = [];
  subs.map(_ => _subs.push([]));

  return g(0, _subs);
}

console.log('\n[0,1,2,3], [2,2]:');
let str = '';
for (let i of f([0,1,2,3], [2,2]))
  str += '\n' + JSON.stringify(i);
console.log(str);

console.log('\n[0,1,2,3], [1,3]:');
str = '';
for (let i of f([0,1,2,3], [1,3]))
  str += '\n' + JSON.stringify(i);
console.log(str);

console.log('\n[0,1,2,3,4,5,6,7,8,9], [1,2,3,4]:');
str = '';
for (let i of f([0,1,2,3,4,5,6,7,8,9], [1,2,3,4]))
  str += '\n' + JSON.stringify(i);
console.log(str);
 类似资料:
  • 在Apache Spark中, -允许将RDD精确划分为分区。 而是如何将给定的RDD划分成分区,使得所有分区(最后一个分区除外)都具有指定数量的元素。鉴于RDD元素的数量是未知的,做<代码>。count()的开销很大。 预期:

  • 我有一个由32个数字组成的数组[1,2,3,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,7,7,7,7,8,9,10,10,11,9,12,13,13,14,14,15,16,17,17] 对于我最初的问题,我不需要生成所有的排列。我只需要在每次运行我的程序时生成一个随机排列。 我的方法是使用Fisher-Yates算法随机洗牌数组,并不断重新洗牌,直到我得到所有8个子数组,没有重

  • 根据所提供的函数对每个元素进行迭代,将这些元素分成两个数组。 使用 Array.reduce() 创建两个数组的数组。 使用 Array.push() 将 fn 返回为 true 的元素添加到第一个数组,而 fn 返回 false 的元素到第二个元素。 const partition = (arr, fn) => arr.reduce( (acc, val, i, arr) => {

  • 问题内容: 说我有一个列表L。如何获得K组所有分区上的迭代器? 示例:L = [2,3,5,7,11,13],K = 3 3组的所有可能分区的列表: ===更新=== 我正在研究一个似乎可行的解决方案,所以我只复制粘贴它即可 输出: 问题答案: 这可行,尽管它可能超级无效(我将它们全部排序以避免重复计算): 它还返回空簇,因此您可能希望将其包装起来以便仅获取非空簇: 计数只是为了检查: 有用 !

  • 英文原文:http://emberjs.com/guides/components/customizing-a-components-element/ 默认情况下,每个组件是一个<div>元素。如果使用开发工具查看渲染后的组件,将看到一个如下所示的DOM表示: 1 2 3 <div id="ember180" class="ember-view"> <h1>My Component</h1>

  • 问题内容: 我对Apache Spark和Python比较陌生,想知道像我将要描述的东西是否可行? 我有一个格式为[m 1,m 2,m 3,m 4,m 5,m 6, … m n ]的RDD(运行rdd.collect()时会得到这个)。我想知道是否有可能将此RDD转换为[[m 1,m 2,m 3),(m 4,m 5,m 6).....(m n-2, m n-1,m n)]。内部元组的大小应为k。如