如果某些对象彼此不兼容,如何对对象进行分组和合并?
Posted
技术标签:
【中文标题】如果某些对象彼此不兼容,如何对对象进行分组和合并?【英文标题】:How to group and merge objects, if some are incompatible with each other? 【发布时间】:2015-03-05 01:26:36 【问题描述】:我有一堆对象,我想将它们合并为尽可能少的复合对象。
我可以计算任何2个对象是否可以合并,如果它们可以合并,则将它们合并。
当且仅当 A 与 B 的一个或多个元素不兼容时,一个对象 A 与另一个由 N 个合并对象组成的 B 不兼容。
贪心解决方案(合并到第一个有效)对于 4 个对象失败,其中 1x4(1 不能与 4 组合)、2x3、3x4。贪心解法将对象 1 和 2 放入第 1 组,然后将对象 3 放入第 2 组,将对象 4 放入第 3 组。正确的解法是将对象 1 和 3 放入第 1 组,将对象 2 和 4 放入第 2 组。
问题的名称是什么,是否可以解决?如果有,算法是什么?
(最坏的情况 = 蛮力,虽然很慢但可行,因为我合并的对象数量非常少。)
编辑:如果不能合并则合并失败,否则合并。未合并和合并都可以访问。花费 O(size(a) + size(b)) 时间并返回一个大小为 (a+b) 的对象。假设大小约为 1000。
【问题讨论】:
这可以建模为图顶点着色问题。 ***.com/q/2445380/718379 youtu.be/c1UBJbfR-H0?t=1574 【参考方案1】:将此视为图形问题。每个对象都是一个顶点,当且仅当v1
和v2
兼容时,才有一条边(v1, v2)
。您现在正在寻找一个 NP-complete 的 clique cover。
请注意,clique 覆盖是一个决策问题(是否可以用 k
cliques 覆盖图形?),但您可以通过对 k
进行二分搜索将其变成优化问题(我可以覆盖例如,有 8 个派系?如果是,请尝试 4,如果不是,请尝试 16,等等)。那么问题仍然是NP完全的。
正如@timrau 已经评论过的那样——正如***链接中提到的那样——补码问题是graph coloring:你有相同的顶点,但现在有一条边(v1, v2)
当且仅当v1
和@987654331 @ 是不兼容的。然后,您想要找到为顶点着色所需的最少颜色数,以使相邻顶点没有相同的颜色。***也为此提供了一些algorithms。
【讨论】:
以上是关于如果某些对象彼此不兼容,如何对对象进行分组和合并?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行