从模板生成排列

Posted

技术标签:

【中文标题】从模板生成排列【英文标题】:Generating permutations from a template 【发布时间】:2019-03-11 00:19:46 【问题描述】:

我的目标是创建一个通用函数,该函数根据给定的模板和参数创建一个用排列(向量)填充的二维向量,如下所示:

必须根据模板作为函数参数向量来固定向量的某些位置。例如,如果给定的模板是0, 1, 0, -1, 3, -1,这意味着排列只会根据-1 位置的数字而变化。 nn-1 是排列可以包含的整数范围。例如。如果n = 4,则向量中只能出现0, 1, 2, 3 length,也就是向量的长度

注意,如果模板中的数字已经出现在其中,则不会在排列中生成。

所以,举个例子:

n = 6, length = 5, template = 2, 1, 0, -1, 0, -1
the permutations are:
2, 1, 0, 3, 0, 3
2, 1, 0, 3, 0, 4
2, 1, 0, 3, 0, 5
2, 1, 0, 4, 0, 3
2, 1, 0, 4, 0, 4
2, 1, 0, 4, 0, 5
2, 1, 0, 5, 0, 3
2, 1, 0, 5, 0, 4
2, 1, 0, 5, 0, 5

如您所见,这些数字仅在索引 3 和 5 中生成(位置,它是 -1),此外,不包括 0, 1 or 2 的位置,因为它们已经出现在模板中。

我需要在不使用 <algorithm> 库的情况下生成这些排列。

我认为创建递归函数是最好的选择,但我不知道如何前进。任何建议都会有所帮助。

谢谢

【问题讨论】:

尝试将问题分解为更小的部分。您可以从生成-1 应替换为的数字列表开始。 我不确定我是否会称这些排列。通常排列采用给定的“有序/索引”集并更改顺序。在这种情况下,您似乎允许我们从中绘制的集合中的多个元素来填充-1 点。 【参考方案1】:

由于您没有提供任何可见的尝试,我认为学习一些工作代码可能会对您有所帮助。这是在 javascript 中(我希望它产生预期的输出)。我希望它可以帮助您提供一些可以翻译成 C++ 的想法。

function f(template)
  console.log(JSON.stringify(template));

  var used = template.reduce((acc, x) =>  if (x != -1) acc.add(x); return acc; , new Set());

  console.log(`used: $Array.from(used)`);

  var needed = new Set(template.reduce((acc, x, i) =>  if (!used.has(i)) acc.push(i); return acc; , []));

  console.log(`needed: $Array.from(needed)`);

  var indexes = template.reduce((acc, x, i) =>  if (x == -1) return acc.concat(i); else return acc; , []);

  console.log(`indexes: $indexes`);

  function g(needed, indexes, template, i=0)
    if (i == indexes.length)
      return [template];

    var result = [];

    // Each member of 'needed' must appear in
    // each position, indexes[i]
    for (x of needed)
      let _template = template.slice();
      _template[ indexes[i] ] = x;

      result = result.concat(
        g(needed, indexes, _template, i + 1));
    

    return result;
  

  return g(needed, indexes, template);


var template = [2, 1, 0, -1, 0, -1];

var result = f(template);

var str = '\n';

for (let r of result)
  str += JSON.stringify(r) + '\n';

console.log(str);

【讨论】:

以上是关于从模板生成排列的主要内容,如果未能解决你的问题,请参考以下文章

枚举排列模板

递归解决全排列生成算法

如何使用 CUDA 生成随机排列

找单词 HDU2082(生成函数模板)

支持从模板生成解析器的模板引擎

使用 LINQ 生成排列