【问题标题】:How do I calculate optimal grouping of objects?如何计算对象的最佳分组?
【发布时间】:2013-05-13 02:08:34
【问题描述】:

我需要能够将一组已知大小的对象分配到 3 个组中。例如,给定一个像下面这样的有序列表,我想找到两个分割点来组成三个总和相似的组。

75, 67, 54, 40, 51, 48, 49, 47

每组的总和必须大致相等,并且第 2 组和第 3 组的总和不能超过第一组的总和超过定义的数量(例如 10)。理想情况下,第一组略大于其他组。项目的顺序不能更改。每个组由原始列表的连续元素组成。每个元素都放在一个组中。

在这种情况下,预期的解决方案是:

Groups: [75, 67], [54, 40, 51], [48, 49, 47]

Sums: 142, 145, 144 

用例是根据前端布局中的已知高度预先计算(服务器端)优先故事到列中的分配。我已经有代码可以为内容提供足够接近的高度(按比例而言),但我正在努力寻找一种有效的分组方式。有充分的理由说明为什么不在前端这样做,但大概也可以在那里使用通用解决方案。

【问题讨论】:

  • 蛮力?如果你不能改变顺序,那么只有 (n-1)(n-2)/2 个分组需要考虑,这是相当小的
  • n 可能高达 50,这对于蛮力来说仍然很快,但想知道是否有更优雅的解决方案。
  • 我稍微编辑了措辞,并将列表中的 57 更改为 48,就像第三组的答案一样。单击编辑时间以查看编辑更改列表

标签: algorithm sorting grouping


【解决方案1】:

鉴于您大约知道要为每个组分配多少(总计 / 3),为什么不遍历列表并将对象分配给组 1 直到其总数达到(总计 / 3),然后对第 2 组,然后将剩余部分转到第 3 组。最终结果可能不适合您的参数,例如第 2 组可能超过第 1 组超过 epsilon,在这种情况下,如果需要,您可以将第 3 组中的一个或两个元素交换到第 2 组,然后如果需要,将第 2 组中的一个或两个元素交换到第 1 组。整个事情应该在 O(n) 中运行,并期望您最后需要交换少于十二个元素。

【讨论】:

  • 谢谢。我可能试图太聪明,而实际上您建议的方案更易于实施,并且在少量项目的情况下足够快。
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 2023-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2017-06-07
相关资源
最近更新 更多