python - 将列表拆分为 N 个子列表,总和大致相等
问题描述
我有一个整数列表,我需要将其拆分为给定数量的子列表(对每个子列表的顺序或元素数量没有限制),以最小化每个子列表总和的平均差异。
例如:
>>> x = [4, 9, 1, 5]
>>> sublist_creator(x, 2)
[[9], [4, 1, 5]]
因为list(map(sum, sublist_creator(x, 2)))
产量[9, 10]
,最小化平均距离。或者,[[9, 1], [4, 5]]
同样正确,我的用例在两种可能性之间没有偏好。
我能想到的唯一方法是通过迭代检查所有可能的组合,但我正在处理一个约 5000 个元素的列表,并且需要将其拆分为约 30 个子列表,因此这种方法非常昂贵。
解决方案
这是大纲:
- 创建
N
空列表 sort()
您的输入数组按升序排列pop()
排序数组中的最后一个元素append()
弹出的元素到具有最低元素的列表sum()
中- 重复 3 和 4 直到输入数组为空
- 利润!!!
对于 M=5000 个元素和 N=30 个列表,如果您仔细存储子列表的中间和而不是每次都从头开始计算它们,这种方法可能需要大约 O(N*M)。
推荐阅读
- angular - 按布尔属性对 FormArray 进行排序
- database - 解释计划显示不同的连接类型
- python - aws Ec2 ubuntu - 导入名称中带有下划线的模块
- dart - 使用带有颤振的谷歌地图时出现错误
- mysql - 部分字符串作为字段值返回 mysql
- php - 获取未捕获的 PDOException:SQLSTATE[42000] 并且找不到它的来源
- java - 如果您使用 G1 GC,为什么建议使用 Java 10?
- python - 提取文本python右侧的数字
- java - Gradle:应用程序看不到从子模块的第二级导入的代码
- android - 如何使用 Firebase android 验证收到的用于手机号码验证的 OTP