考虑n个有限集的集合A,其成员不一定是不相交的。设P = {P [1],P [2],...,P [m]}为A的分区,对于1..m中的每个i,设U [i]为所有的并集P [i]的要素。所以U = {U [1],U [2],...,U [m]}。我想要一种算法来找到一个P,使得相应的U是一个分区,并且使得U的最小和最大元素之间的基数(即大小)的差异最小化。
数据特征:
答案 0 :(得分:1)
在问题评论中我的项链类比表明了这个解决方案:
我有兴趣知道是否有更有效的解决方案。特别是,我有一种预感,即在步骤4中重复使用bin-packing算法是不明智的。
答案 1 :(得分:0)
我从A的交叉图开始,当两个节点具有非空交集时,其具有A和边的节点元素。对于某些i,该图的每个连通分量必须包含在单个P(i)中。
让C(1),...,C(k)成为图的连通分量。让
size(j)=|union(a in C(j))|
现在你可以用大小(i)值重写问题,i = 1 ... k。即,给定正整数值s(1),...,s(k)。对于[1,.. k]的子集P,我们定义s(P)= sum(j在P中)s(j)。
我们希望找到[1,..,k]的分区P'=(P'(1),...,P'(m)),条件是它最小化值:
max s(P'(j)) - min s(P'(j))
因此,我们确实不需要知道A元素的可能大小,而是知道图形的连通分量的可能大小,以提出“最佳”算法。