项目列表中的组合

时间:2012-09-04 18:34:37

标签: c++ list combinations combinatorics

我有一个收藏清单:
{A B}
{C D E}
{F G}

行数可以是任意的,行中的项目数也可以是任意的。

我需要得到这个:
{ACF ACG ADF ADG AEF AEG BCF BCG BDF BDG BEF BEG}

有人可以指出一些可以做到这一点的算法或至少是问题的名称 - 如果有的话。

3 个答案:

答案 0 :(得分:0)

您可以创建一个递归函数,该函数接受列表的原始集合以及集合中列表的当前索引。然后,它将遍历列表中的项目以及每个项目调用本身的增加索引。

答案 1 :(得分:0)

在你的例子中,你说你只需要这个:

{ACF ACG ADF ADG AEF AEG BCF BCG BDF BDG BEF BEG}

如果您还需要所有其他组合,那么您可以使用我编写的类来处理常用函数以处理二项式系数,这是您的问题所面临的问题类型。它执行以下任务:

  1. 以任意N选择K到文件的格式输出所有K索引。 K索引可以用更具描述性的字符串或字母代替。这种方法使解决这类问题变得非常简单。

  2. 将K索引转换为已排序二项系数表中条目的正确索引。这种技术比依赖迭代的旧发布技术快得多。它通过使用Pascal三角形中固有的数学属性来实现。我的论文谈到了这一点。我相信我是第一个发现和发布这种技术的人,但我可能错了。

  3. 将已排序的二项系数表中的索引转换为相应的K索引。

  4. 使用Mark Dominus方法计算二项式系数,这样就不太可能溢出并使用更大的数字。

  5. 该类是用.NET C#编写的,它提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用名为InitTable的bool值,当为true时,将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。不需要创建表来执行上述4种方法。提供访问者方法来访问该表。

  6. 有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,并且没有已知的错误。

  7. 要阅读此课程并下载代码,请参阅Tablizing The Binomial Coeffieicent

    将此课程转换为您选择的语言应该不难。

答案 2 :(得分:0)

实际上很容易:

这是C ++中的解决方案,如果第一组是A,第二组是B,第三组是C;

cout << "{ ";
for( int i=0; i<a_size; ++i ) {
  for( int j=0; j<b_size; ++j ) {
    for( int k=0; k<c_size; ++k ) {
      cout << A[ i ] << B[ j ] << C[ k ] << " ";
    }
  }
}
cout << " }\n";