将一个list中的值尽可能平均分成N份,使得每一份的值大致相同


#类似哈夫曼树的构成规则的思路,将小的元素放在一起,同大的相当
def split_array(arr, split_num):
    
        #子数组和类节点,存储和值和子数组编号
    class node:
        def __init__(self,a,b):
            self.num=a
            self.idx=b
    #小顶堆实现函数
    def HeapAdjust(s, a, n):
        temp = s[a]
        i=a*2
        while i <= n:
            if (i < n and s[i].num> s[i + 1].num):
                i+=1
            if (temp.num <= s[i].num):
                break
            s[a] = s[i]
            a = i
            i *= 2
        s[a] = temp
    def HeapSort(s, n):
        i = n // 2
        while i >= 1:
            HeapAdjust(s, i, n)
            i-=1


    
    if len(arr)<=split_num:
        res=[[x] for x in arr]
        for i in range(split_num-len(res)):
            res.append([])
        return res
    res=[[] for i in range(split_num)]
    arr.sort(reverse=True)
    nums=[[node(-1,-1)]]#堆排序第一个元素占位
    for idx in range(split_num):
        res[idx].append(arr[idx])
        nums.append(node(arr[idx],idx))
    HeapSort(nums,len(nums)-1)
    for item in arr[split_num:]:
        top_id=nums[1].idx
        res[top_id].append(item)
        nums[1].num+=item
        HeapAdjust(nums,1,len(nums)-1)
    return res


split_num = 4
print(split_array([3,4,5,6,7,8,100,101,200,300,400,500], split_num))

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值