【发布时间】:2019-03-09 04:30:25
【问题描述】:
假设我有一个列表列表,例如:
[ [ a1, a2, a3, a4, a5], [b1, b2, b3, b4, b5, b6, b7, b8], [c1, c2, c3, c4, c5, c6], [d1, d2, d3, d4] ]
比较所有列表项的长度并将它们组合成一个长度尽可能接近但小于或等于 x 的列表的最简单方法是什么?
所以对于上面的例子,x=12:
[ [a1, a2, a3, a4, a5, c1, c2, c3, c4, c5, c6], [b1, b2, b3, b4, b5, b6, b7, b8, d1, d2, d3, d4] ]
输出中各个组(例如 a、b、c...)的顺序并不重要,但不能分解各个组。
我知道我可以,例如,获取第一组的长度,然后按顺序获取每个后续组的长度,如果它们的 sum = x 然后弹出这些列表并将它们的项目附加到返回的列表中,如果然后不再检查每个组的长度之和是否=x-1,如果是,则弹出并追加,然后继续使用长度之和=x-2等,直到输入列表为空。
对于像给出的示例这样的小团体来说,这会很好,但是当输入列表的 len 变得非常大时呢?有没有更高效的方法/算法?
【问题讨论】:
-
我会开始构建一个数组长度的字典。像 {4:[3], 5:[0], 6:[2], 8:[1]...} 其中每个长度都是原始列表列表中索引列表的关键。然后我会分配最接近最大值的元素。然后逐步重复以尝试“填满”组。
-
这似乎类似于背包问题en.wikipedia.org/wiki/Knapsack_problem
-
这被称为bin packing problem。 greedy solution 适用于大多数应用程序。
-
你如何选择是否制作长度列表 (12, 12, 1) vs (12, 6, 7) vs (12, 10, 3) vs ...?
标签: python algorithm list sorting