用于将集合集划分为大致相等大小的块的算法?

时间:2011-03-05 08:37:50

标签: algorithm discrete-mathematics

考虑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的最小和最大元素之间的基数(即大小)的差异最小化。

数据特征:

  • m小(2至5)且n <10000
  • 通常,A
  • 中存在大比例的1元素集
  • A中的成对对之间的交点通常很小或为空

2 个答案:

答案 0 :(得分:1)

在问题评论中我的项链类比表明了这个解决方案:

  1. 构建一个无向图G,其顶点是A的元素,如果A [i]与A [j]相交,则存在从A [i]到A [j]的边。
  2. 找到G的连通分量C.这可以通过简单的广度优先或深度优先算法来完成。
  3. 对于每个C [i],取C [i]的顶点并将它们合并在一起,得到D [i]。您现在已将问题简化为特殊情况,因为集合D是A元素的并集的分区。
  4. 使用bin-packing算法尝试将D的元素拟合到精确的m个bin中,每个bin的大小为ceil(t / m),其中t是D的所有元素的并集大小。如果失败,反复增加箱子的大小,直到它成功或者很明显它永远不会成功。 Bin打包算法通常是启发式的,因此可能找不到完美的解决方案。此外,这不仅仅是一个简单的装箱问题,因此即使是完美的装箱算法也可能找不到最佳解决方案。
  5. 我有兴趣知道是否有更有效的解决方案。特别是,我有一种预感,即在步骤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元素的可能大小,而是知道图形的连通分量的可能大小,以提出“最佳”算法。