【问题标题】:Algorithm for partitioning set of sets into approximately equal-sized chunks?将一组集合划分为大致相等大小的块的算法?
【发布时间】:2011-03-17 02:17:27
【问题描述】:

考虑一个由 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
  • 通常,A 中有很大比例的一元集
  • A 中的集合对之间的交点通常很小或为空

【问题讨论】:

  • 这是大学作业吗?
  • "我想要一个算法来找到一个P使得对应的U是一个分区"一个分区是什么?据我所知,U[i] 的成员是 P[i] 和 A 的成员的成员......你能举一个具体的例子来说明你在说什么吗?
  • @jswolf U 的所有元素并集的分区。这个并集实际上与 A 的所有元素的并集相同。更简单地说,我可以说“ U 的元素是成对不相交的”。举一个具体的例子,考虑一盒项链,每条项链上都有一个或多个珠子,一些项链可能在一个或多个点上相互系在一起。我想将项链分成几堆,而不是将它们分开或切割,以便这些堆包含相等数量的珠子,或尽可能接近相等数量的珠子。希望有帮助!

标签: algorithm discrete-mathematics


【解决方案1】:

我在问题 cmets 中的项链类比提出了这个解决方案:

  1. 构建一个无向图 G,其顶点是 A 的元素,如果 A[i] 与 A[j] 相交,则从 A[i] 到 A[j] 有一条边。
  2. 找到 G 的连通分量 C。这可以通过简单的广度优先或深度优先算法来完成。
  3. 对于每个 C[i],取 C[i] 的顶点并将它们合并在一起,得到 D[i]。您现在已将问题简化为一种特殊情况,因为集合 D 是 A 的元素并集的一个分区。
  4. 使用装箱算法尝试将 D 的元素精确放入 m 个箱中,每个箱的大小为 ceil(t/m),其中 t 是 D 的所有元素的并集大小。如果失败,反复增加垃圾箱的大小,直到它成功或者很明显它永远不会成功。装箱算法通常是启发式的,因此可能找不到完美的解决方案。此外,这不仅仅是一个简单的装箱问题,因此即使是完美的装箱算法也可能找不到最佳解决方案。

我很想知道是否有更有效的解决方案。特别是,我有一种预感,在第 4 步重复使用装箱算法是不明智的。

【讨论】:

  • 我不知道它是否是最优的,但我想知道你是否不能只使用按大小对 D 的元素进行排序的贪心算法,然后从最大的元素开始放置每个元素放入计数最少的垃圾箱...
  • A 中的一元集使装箱更容易,因为它们填充了空白区域。你确定你的 bin-packing 实例真的很难吗?
  • A 的单元素集只有在上述图中位于它们自己的连通分量中时才有用。关键数字是 D(i) 的大小。如果你在 A 中的一个集合是问题空间的整个宇宙,那么很多单例并没有真正的帮助。
  • 另一方面,A 的单元素集确实使生成交集图的任务更快...
  • 问题的最后一部分,本质上是一个装箱问题,是NP完全的,对吧?因此,对于一个可用的算法,我们需要处理 D(i)s 的预期数量及其大小的分布。
【解决方案2】:

我将从 A 的交集图开始,当两个节点具有非空交集时,它具有 A 的节点元素和边。对于某些 i,该图的每个连通分量都必须包含在单个 P(i) 中。

令 C(1),...,C(k) 为图的连通分量。让

size(j)=|union(a in C(j))|

现在您可以根据 size(i) 值重写问题,其中 i=1...k。即,给定正整数值 s(1),..,s(k)。对于 [1,..k] 的子集 P,我们定义 s(P)=sum(j in P) s(j)。

我们希望找到 [1,..,k] 的分区 P'=(P'(1),...,P'(m)),条件是它的值最小化:

max s(P'(j)) - min s(P'(j))

因此,我们真的需要知道的不是 A 的元素的可能大小,而是图的连通分量的可能大小,以提出“最佳”算法。

【讨论】:

  • 我看到这与 Robin 给出的答案相同,他写得更有说服力。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多