permutation - 生成有限制的随机多集排列

标签 permutation combinatorics

是否有任何已知的算法如何有效地生成具有附加限制的任何随机多集排列。

例子:
我有多个项目,例如:{1,1,1,2,2,3,3,3} ,以及一组限制性的集合,例如 { {3} , {1,2} , {1,2,3} , {1,2,3} , {1,2,3} , {1,2,3} , {2,3} , {2,3} }.我正在寻找项目的排列,但第一个元素必须是 3,第二个元素必须是 1 或 2,等等。

一种符合限制的排列是:{3,1,1,1,2,2,3,3}

最佳答案

就在这里。我问了 this German forum并得到以下答案:问题可以简化为查找 a maximum matching on a bipartite graph .
为此,请为多重集中的所有元素引入顶点。这些顶点形成二部图的一侧。然后,为每个限制集引入顶点。这些顶点形成二部图的另一侧。现在将每个限制集中的边引入第一边的顶点,使得第一边的顶点“命中”当且仅当它表示包含在连接集中的元素。

您示例的二部图如下所示:
enter image description here

现在匹配以不选择任何两条相邻边的方式选择边。例如。为第二个限制“{1,2}”选择第一个“1”,然后它不能再用于任何其他限制,因为使用来自该顶点的另一条边将不再导致匹配。

如果您对此有其他问题,请随时提问。

关于permutation - 生成有限制的随机多集排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881551/

相关文章:

python - 与Python dict的组合总和

java - 如何连接句子中单词呈现的所有情况JAVA

algorithm - 独特的排列 - 有异常(exception)

java - 在java中生成没有重复/排列的变体

algorithm - 实现 Papadimitriou 和 Steiglitz 所描述的匈牙利方法

生成移位字符组合所需的算法

python - 列表列表内和列表之间的排列 [python]

python - 如何使用递归但不使用 for 或 while 循环来获得不重复的字符串排列?

计算给定约束下可能的密码数量

algorithm - 高效的并行握手(组合)