我有一个集合列表:
{AB}
{CDE}
{FG}
行数可以是任意的,一行中的项目数也可以是任意的。
我需要得到这个:
{ACF ACG ADF ADG AEF AEG BCF BCG BDF BDG BEF BEG}
有人可以指出一些可以做到这一点的算法,或者至少是问题的名称 - 如果有的话。
我有一个集合列表:
{AB}
{CDE}
{FG}
行数可以是任意的,一行中的项目数也可以是任意的。
我需要得到这个:
{ACF ACG ADF ADG AEF AEG BCF BCG BDF BDG BEF BEG}
有人可以指出一些可以做到这一点的算法,或者至少是问题的名称 - 如果有的话。
其实很简单:
这是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";
您可以创建一个递归函数,该函数接受列表的原始集合和集合中列表的当前索引。然后它将遍历列表中的项目,并在每个项目上使用增加的索引调用自身。
在你的例子中,你说你只需要这个:
{ACF ACG ADF ADG AEF AEG BCF BCG BDF BDG BEF BEG}
如果您还需要所有其他组合,那么您也许可以使用我编写的一个类来处理处理二项式系数的常用函数,这是您的问题所属的问题类型。它执行以下任务:
将任何 N 选择 K 的所有 K 索引以良好的格式输出到文件。K-indexes 可以替换为更具描述性的字符串或字母。这种方法使得解决这类问题变得非常简单。
将 K 索引转换为已排序二项式系数表中条目的正确索引。这种技术比依赖迭代的旧已发布技术快得多。它通过使用帕斯卡三角形固有的数学属性来做到这一点。我的论文谈到了这一点。我相信我是第一个发现并发表这种技术的人,但我可能是错的。
将已排序二项式系数表中的索引转换为相应的 K 索引。
使用Mark Dominus方法计算二项式系数,它不太可能溢出并且适用于更大的数字。
该类是用 .NET C# 编写的,并提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用一个名为 InitTable 的 bool 值,当它为 true 时,将创建一个通用列表来保存要管理的对象。如果此值为 false,则不会创建表。无需创建表即可执行上述 4 种方法。提供了访问器方法来访问表。
有一个关联的测试类,它显示了如何使用该类及其方法。它已经用 2 个案例进行了广泛的测试,并且没有已知的错误。
要了解此类并下载代码,请参阅制表二项式系数。
将此类转换为您选择的语言应该不难。