【问题标题】:combinations from a list of items项目列表中的组合
【发布时间】:2012-09-04 18:34:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您正在寻找三组的笛卡尔积。在某些情况下也使用张量积。
  • 解决方案是here

标签: c++ list combinations combinatorics


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    4. 使用Mark Dominus 方法计算二项式系数,该方法不太可能溢出并且适用于较大的数字。

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

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

    要了解该课程并下载代码,请参阅Tablizing The Binomial Coeffieicent

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

    【讨论】:

      【解决方案3】:

      其实很简单:

      这里是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";
      

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 2011-07-31
        相关资源
        最近更新 更多