是否可以获取组合的索引而不生成它?

时间:2019-06-20 23:27:22

标签: algorithm math

我的意思是一个函数,它接受元素数组和组合作为参数,并返回一个表示组合索引的数字,而不会生成每个组合。

我没有偏好,可以使用任何编程语言。

代码getCombinationIndex("114")的示例,应返回组合114的索引。

[1,1,1]: 1
[2,1,1]: 2
[3,1,1]: 3
[4,1,1]: 4
[.....]
[1,1,4]: ?

2 个答案:

答案 0 :(得分:1)

假设您正在考虑来自字母k的{​​{1}}个符号的组合(即,按A = {a_0, a_1, ..., a_n}的顺序按字母顺序排列,n个符号和a_i < a_j个符号)。在您的示例中,您有一个由4个符号i < jA = {1, 2, 3, 4}个符号组成的字母。

然后,组合 k = 3可以唯一编码c = [a_i1, a_i2, ..., a_ik]。您要查找的索引是I(c) = i1 + n*i2 + (n^2)*i3 + ... + (n^(k-1))*ik


让我们看看它在您的示例中如何工作:

F(c) = I(c) + 1

答案 1 :(得分:1)

此问题可以看作是基本转换。首先,您需要两个信息,然后这只是一个基本转换。

  1. 基地
    在您的情况下,这是所有项目中数量最多的。
    [4,1,1] -> 4
  2. 所需的组合

这仅适用于所有项目可以具有相同最大值的前提。


算法

  1. 颠倒项目顺序
  2. 将每个项目减1
  3. 将数字转换为以10为底的数字
  4. 递增1

示例

  1. 开始:114
  2. 反向:411
  3. 减量:300
  4. 转化:
    基数4:300
    基数10:3 * 4 ^ 2 + 0 * 4 ^ 1 + 0 * 4 ^ 0 = 24
  5. 增量: 25