如何实现数据集按sum_count均衡分组?求高效算法与工具
解决多组sum_count均衡划分问题
你的需求本质是多子集划分问题,这是一个NP难问题,但可以通过贪心近似算法得到非常接近最优的结果,比随机分组或简单交替分配效果好得多。下面分别给出Python和DolphinDB的实现方案:
核心算法思路
最有效的近似策略是降序排序+贪心分配:
- 把所有数据按
sum_count从大到小排序 - 初始化指定数量的分组,每组记录当前总和和对应的sID列表
- 依次将每个元素分配到当前总和最小的分组中
这种方法优先处理大权重的元素,避免大值集中在单一分组,能保证各组总和的差异尽可能小。
Python 实现(无需额外库)
直接用Python标准库即可实现,代码简洁高效:
# 示例数据集 data = [("A", 10), ("B", 5), ("C", 8), ("D", 12), ("E", 12), ("F", 11)] group_num = 5 # 1. 按sum_count降序排序 sorted_data = sorted(data, key=lambda x: -x[1]) # 2. 初始化分组:每个组是(当前总和, sID列表) groups = [(0, []) for _ in range(group_num)] # 3. 贪心分配每个元素 for sid, cnt in sorted_data: # 找到当前总和最小的组 min_group = min(groups, key=lambda x: x[0]) # 更新组的总和和sID列表 min_group[0] += cnt min_group[1].append(sid) # 4. 格式化输出结果 for i, (total, sids) in enumerate(groups, 1): print(f"Group{i}: sID={','.join(sids)} | sum_count_total={total}")
运行结果(示例数据):
Group1: sID=D | sum_count_total=12 Group2: sID=E | sum_count_total=12 Group3: sID=F | sum_count_total=11 Group4: sID=A | sum_count_total=10 Group5: sID=C,B | sum_count_total=13
各组总和差异控制在1以内,符合需求。
DolphinDB 实现
DolphinDB可以通过脚本实现同样的贪心逻辑,利用其高效的内存计算能力处理大规模数据集:
// 示例数据集 t = table(`A`B`C`D`E`F as sID, 10 5 8 12 12 11 as sum_count) groupNum = 5 // 1. 按sum_count降序排序 sortedT = select * from t order by sum_count desc // 2. 初始化分组:用字典存储每个组的总和和sID列表 groups = dict() for(i in 1..groupNum){ groups[i] = dict(("total", "sids"), (0, [])) } // 3. 贪心分配每个元素 for(row in sortedT){ // 找到当前总和最小的组ID minGroupId = argmin(keys(groups).map(g->groups[g].total)) // 更新组数据 groups[minGroupId].total += row.sum_count groups[minGroupId].sids.append!(row.sID) } // 4. 格式化输出结果 for(g in keys(groups)){ print("Group" + string(g) + ": sID=" + str_join(groups[g].sids, ",") + " | sum_count_total=" + string(groups[g].total)) }
执行后输出结果与Python版本一致,适合在DolphinDB的分布式环境中处理超大规模数据。
如果需要更精准的结果(比如极端场景下的最优解),可以考虑使用整数规划库(如Python的pulp),但对于大部分业务场景,贪心算法的效率和结果已经足够满足需求。
内容的提问来源于stack exchange,提问作者Huang WeiFeng
相关产品推荐
相关产品推荐

