首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组合分组算法

组合分组算法
EN

Stack Overflow用户
提问于 2013-08-26 15:11:38
回答 1查看 2K关注 0票数 6

假设我有一个项目列表,每个项目都由一个简单的结构定义

代码语言:javascript
运行
复制
struct simpleItem
{
    String Category1;
    String Category2;
    ...
    String CategoryN;
}

每个项目都有属于某些类别的一系列值。在处理列表时已知类别N的数目,并且每个项目有相同的类别数量,每个类别只有一个值,没有重复的项。但是,每个列表可以有不同的类别集。

我在寻找一种方法,将这些项目按类别分组,如果将这些组分解为单个项目,通过组合每个类别排列,我将得到原来的组合,没有重复。

小组的结果是:

代码语言:javascript
运行
复制
struct grouped
{
    String[] Category1;
    String[] Category2;
    ...
    String[] CategoryN;
}

示例

为了这个例子,我们将限制在3类,但可以有N。

类别

动物,眼睛颜色,毛皮

选择“动物”类:猫、狗、鼠、马

选择“眼睛颜色”类别:蓝色、黄色、绿色、红色、橙色

选择“毛茸茸”类:长,短,卷

如果列表中包含了这三个类别的所有排列,那么最终结果将是

组1 :

动物

眼睛蓝色,黄色,绿色,红色,橙色

皮毛

例如,如果我有一个子列表:

  1. 猫,蓝,长
  2. 猫,蓝,矮
  3. 狗,蓝,长
  4. 狗,蓝,矮
  5. 狗,绿龙
  6. 老鼠,红的,矮的
  7. 老鼠,蓝的,矮的

让我们调用这个列表,输入(A)

将这些项目分组后,我们可以得到:(可能还有其他可能性)。分组标准是尽可能减少输出组。

组1:

动物

代码语言:javascript
运行
复制
      Eye Color [Blue           ]
代码语言:javascript
运行
复制
  Fur           [Long, Short]

组2:

动物-可接受性

代码语言:javascript
运行
复制
      Eye Color [Green      ]
代码语言:javascript
运行
复制
  Fur           [Long]

第3组:

 /T1593-1989动物商品转归性、转产性、变价

眼睛颜色红,蓝

皮毛、商品等

让我们调用这些组,输出(B)

正如我们所看到的,通过组合结果组的每个项,我们将返回到(A)中7个元素的原始输入列表。

问题

因此,我试图编写一个生成这些组的算法。我试着用LINQ做这件事,但我也愿意听取其他建议。从(A)(B)的任何建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-26 15:22:28

  1. 接受每一项输入,并将其视为属于自己的组。
    • 例如,Cat,Blue,Long就变成了Cat,Blue,Long,每个类别都有一个项目。

  1. 从第一组开始,检查列表中的每个组。将其与列表中的另一组配对。如果这些组符合适当的标准,则将它们组合成一个组。
    • 合并组的条件是,n-1类别的值集是否相同,而恰好一个类别集不匹配。如果是这样的话,创建一个新的组,n-1相似的类别相同,其余的类别是集合的交集。

  1. 如果找到匹配项,请停止比较对,然后从第一组中的第一项开始。(这里使用延迟执行可以帮助您,这样您就不会在找到匹配时立即将组组合起来。)
  2. 如果你在没有找到匹配的情况下遍历整个集合,那么你就完成了,就没有更多的组合要做了。

所以,看看你的例子。首先,它将第一组和第二组配对。前两个类别集相同,第三个类别集不同,因此可以合并它们。现在您有了一个列表,即:

  1. 猫,蓝色,长,短
  2. 狗,蓝,长
  3. 狗,蓝,矮
  4. 狗,绿,长
  5. 老鼠,红的,矮的
  6. 老鼠,蓝的,矮的

接下来我们比较(新的)第一组和第二组。第一和第三类都不匹配,没有合并。接下来我们比较第一和第三,同样的两个类别是不匹配的。第一组与其他任何一组都不匹配。现在我们进入第二组。我们把它和第三个配对。它可以合并,因为前两类是不同的:

  1. 猫,蓝,长,短
  2. 狗,蓝色,Long,Short
  3. 狗,绿,长
  4. 老鼠,红的,矮的
  5. 老鼠,蓝的,矮的

现在我们重新开始,将第一组和第二组配对。他们匹配。第一类是不同的,第二个是相同的,第三个是一样的。现在是:

  1. 猫,狗,蓝色,长,短
  2. 狗,绿,长
  3. 老鼠,红的,矮的
  4. 老鼠,蓝的,矮的

我们现在把第一个和另外三个比较一下,没有一个能与之匹配。然后我们将第二个和另外两个进行比较,没有一个能与之匹配。最后,第三和第四类将匹配,因为只有第二类不同:

  1. 猫,狗,蓝,长,短
  2. 狗,绿,长
  3. 大鼠,红,蓝,短

最后,我们将通过所有的组合,没有一个组将匹配合并条件,我们完成了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18447375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档