【问题标题】:Encoding Permutations With Repeating Values使用重复值编码排列
【发布时间】:2018-06-27 05:48:55
【问题描述】:

我正在尝试在三个位置生成 A、B、C、D、E 的所有组合:

A,A,A
A,A,B
C,A,E
C,B,A
C,B,B
etc...

我已经了解了阶乘数字系统和组合数字系统,但我仍然无法找到正确的实现。一般过去我都使用递归来解决这个问题,但是在这种情况下我不想生成整个列表来找到一个值,所以我需要一个编码。

理想情况下,我对组合有一个整数编码,所以我可以简单地调用一个带有迭代整数的函数来生成正确的排列。

还有这叫什么,我如何才能更多地了解方法的变化?我见过的一些类似的解决方案只生成不重复的组合(ABC,ABD),而其他的则不重用值。

根据我过去的递归方法,我的猜测是permutation(0) 将导致aaapermutation(100) 将导致adw

【问题讨论】:

标签: algorithm combinations permutation combinatorics


【解决方案1】:

您寻找的特定组合似乎只是“每个位置上的 A、B、C、D、E 中的任何一个”。 在这种情况下,它们非常类似于“五进制”(以 5 为底)positional numeral system:您有三个数字,每个数字可以独立地为 0 (A)、1 (B)、2 (C)、3 (D ) 或 4 (E)。 将它们编码为整数也是如此:只需将它们从 0 编号到 53-1。

对于数字 k,“组合”是“(k div 52) mod 5, (k div 51) mod 5, (k div 5 0) mod 5,ABCDE 分别编码为01234

对于像“xyz”这样的“组合”,首先将字母ABCDE映射到数字01234为x、y、z,然后编码为x*52 + y*51 + z*50.

【讨论】:

  • 这是用于排列的。一次选择 3 的一组 5 的组合数应该只返回 35 个结果。
  • @Emil 给出的示例不是组合意义上的组合。见A, A, BC, A, E
  • 同意,但现在看来我们需要更多说明
  • @Blaine。不。如果您想要重复的组合(“多少 Bs”很重要,“Bs 在哪里”无关紧要),请选择您链接的答案。如果职位也很重要(“ABB”与“BBA”不同),请按照我的回答。
  • 感谢您的帮助!这是我写的解决方案:play.golang.org/p/aneADJMSqxA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多