Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数组分成几乎相等和的块_Python_Arrays_Algorithm - Fatal编程技术网

Python 将数组分成几乎相等和的块

Python 将数组分成几乎相等和的块,python,arrays,algorithm,Python,Arrays,Algorithm,用于划分块的代码由以下代码段提供: def chunks(lst, n): #n here is 4 """Yield successive n-sized chunks from lst.""" for i in range(0, len(lst), n): yield lst[i:i + n] 作为输入,我有一个包含以下整数的列表: [11, 45, 74, 24, 27, 55, 37,

用于划分块的代码由以下代码段提供:

def chunks(lst, n):     #n here is 4
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]
作为输入,我有一个包含以下整数的列表:

[11, 45, 74, 24, 27, 55, 37, 97, 15, 36, 54, 7, 41, 77, 28, 36, 22, 214, 110, 40, 41, 14, 6, 35, 6, 7, 62, 2, 34, 1, 30, 5, 4, 8, 9, 7, 5, 7, 0, 0, 3, 0, 0, 1, 2]
我想用它生成4个块。作为输出,我得到以下结果:

[[11, 45, 74, 24, 27, 55, 37, 97, 15, 36, 54, 7], 
[41, 77, 28, 36, 22, 214, 110, 40, 41, 14, 6, 35], 
[6, 7, 62, 2, 34, 1, 30, 5, 4, 8, 9, 7], 
[5, 7, 0, 0, 3, 0, 0, 1, 2]]
我的问题是,输出中的第二个列表的权重高于其他列表;这些数字的分布不太公平。
有谁能告诉我如何通过包含整数来获得数据在数据块中的公平分布

我亲手做了一个例子:

输入:
[11,20,2,4,8,13,16,0,1,0,3,6]


输出:
[[20,1,0,0],[16,6],[13,8],[11,4,3,2]

我们可以先尝试将数组分成两部分,使其总和几乎相等。
一旦我们有了这两个集合,我们就可以对每个集合应用相同的过程,得到2*2=4个相等和的集合

将数组划分为近似相等和的两部分的算法如下所示:

  • 初始化2个空集合以保存我们的答案
  • 按相反顺序对数组排序
  • 在保持两个集合的总和的同时,迭代数组中的所有元素,并将它们附加到总和较小的集合中
  • 请注意,这只是一个近似算法。如果我们想找到精确的最优答案,那么我们可以将这个问题建模为,并找到是否可以将数组分为两部分,其中一个集合有sum
    sum/2
    sum/2-1
    sum/2-2
    <代码>0(按该顺序尝试每个代码)。这比我们的近似解要慢得多
编辑:

为了将相同的算法推广到“n”个拆分,我们可以使用堆:

  • 创建一个大小为“n”的最小堆,其中每个元素都是一个形式的元组(当前集合的总和)
  • 所以,最初堆将包含元素
    (0,0),(0,1)。。。(0,n-1)
  • 现在迭代反向排序数组,并将每个元素分配给堆顶部的集合
  • 使用添加到集合中的元素的新总和更新集合的heap元素
导入heapq
def几乎平均分配(arr、num块):
arr=已排序(arr,reverse=True)
heap=[(0,idx)用于范围内的idx(num_chunks)]
heapq.heapify(堆)
集合={}
对于范围内的i(num_块):
设置[i]=[]
arr_idx=0
当arr_idx
输出:

[20, 16, 13, 11, 8, 6, 4, 3, 2, 1, 0, 0]   84

[13, 8]   21
[16, 3, 2]   21
[11, 6, 4]   21
[20, 1, 0, 0]   21
[20, 16, 13, 11, 8, 6, 4, 3, 2, 1, 0, 0]   84

[20, 1]   21
[16, 4, 0, 0]   20
[13, 6, 3]   22
[11, 8, 2]   21

您是否有一个衡量标准,来衡量您希望分布的“均衡”程度?一个解决方案是对输入列表进行排序,然后从n个元素中为每个块选择1个。这里有一个整数较少的示例:[11,20,2,4,8,13,16,0,1,0,3,6]想要的输出:[[20,1],[16,6],[13,8],[11,4,3,2]]我是手工做的,我不知道如何编码。你能把你的问题编辑成包含最小可复制的例子吗?嘿@menbar我不理解你的问题,伙计。你的例子一开始似乎有点错误。。。[16,3,2应该是块,,[11,6,4]应该是另一个对吗?好的。那么你已经知道多进程的事情了吗?如果是的话,那么我建议你可以从问题中删除多进程标记以消除混淆。谢谢!有没有一种方法,我可以说,我想要多少个块?在这个例子中,我说我需要4个块。那么,当我需要6个块时呢?有没有一种简单的方法来形成你的答案代码?非常感谢!用一个更通用的解决方案更新了它。在考虑它时很开心:)你能帮我用这种输入生成块吗?[[11,“a”],[20,“a”],[2,“a”],[4,“a”],[8,“a”],[13,“a”],[0,“a”],[1,“a”],[0,“a”],[3,“a”],[6,“a”]块应该用整数生成,但是列表中的字符串必须跟在整数后面?非常感谢!
[20, 16, 13, 11, 8, 6, 4, 3, 2, 1, 0, 0]   84

[20, 1]   21
[16, 4, 0, 0]   20
[13, 6, 3]   22
[11, 8, 2]   21