以 3 为一组对项目进行分组的算法

标签 algorithm combinatorics

我正在尝试解决一个问题,其中我有像这样的对:

A C
B F
A D
D C
F E
E B
A B
B C
E D
F D

我需要将它们分成 3 组,其中我必须从该列表中找到匹配的三角形。基本上我需要一个结果,如果它可能或不对集合进行分组。

所以可能的组是(ACDBFE),或者(ABCDEF)和这个集合是可分组的,因为所有字母都可以分组为 3 个一组,并且没有一个被遗漏。

我制作了一个脚本,我可以在其中实现少量输入,但对于大量输入,它变得太慢了。

我的逻辑是:

make nested loop to find first match (looping untill I find a match)
 > remove 3 elements from the collection
  > run again

我一直这样做,直到我没有信件。由于可能有不同的组合,我从不同的字母开始多次运行此程序,直到找到匹配项。

我可以理解,这给我的循环顺序至少为 N^N 并且可能会变得太慢。有没有更好的逻辑来解决这些问题?这里可以用二叉树吗?

最佳答案

这个问题可以建模为图 Clique cover problem .每个字母都是一个节点,每一对都是一条边,您希望将图形划分为大小为 3(三角形)的vertex-disjoint cliques。如果您希望分区具有最小基数,那么您需要一个最小团覆盖
实际上这将是一个 k-clique 覆盖问题,因为在 clique 覆盖问题中你可以有任意/不同大小的 cliques。

关于以 3 为一组对项目进行分组的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40193648/

相关文章:

python - 给出一个 nums 列表...每 2 个数字相加(例如 : 1, 2,3,4 -> 3, 7)?

string - 使字符串回文的最少插入

algorithm - 评估谷歌地图中道路 "twistiness"的技术?

string - 求一个 n 位数字中能被 8 整除的子序列的个数

c++ - 基于初始输入生成所有组合(n 选择 k)的快速算法

arrays - 如何在数组中查找连通分量

r - 列出数据框中没有观察值的所有因素(相互作用)组合,直到给定维度,删除冗余

prolog - 计算序言中 map 着色的数量

r - 创建给定长度的所有多重索引

iphone - 鸽笼问题: Placing different types of UIImages into UIImageViews