python – 将数组拆分为均匀分布的块

我正在寻找一种有效的方法将数组拆分成具有类似直方图的块.

例如,给定数组:

l = np.array([1, 2, 3, 4, 1, 1, 1, 2, 3, 4, 55, 5, 5, 5, 5, 5, 3, 2, 2, 21, 2])

我想获得:

c1 = np.array([1, 4, 1, 5, 5, 3, 2])
c2 = np.array([2, 1, 3, 4, 5, 5, 2])
c3 = np.array([3, 1, 2, 55, 5, 2, 21])

不仅如此,每个块在给定函数f上应具有相似的大小和类似的总和:

1. |sum(ci, f) - sum(cj, f)| < e, for i != j
2. |len(ci) - len(cj)| < e, for i != j

哪里

sum(c, f) = f(c[0]) + ... + f(c[len(c)])

编辑:
澄清这个意图.我希望将列表上的流程并行化为n个子流程,但必须在每个子流程之间均匀分配成本.处理该列表中的元素的成本是数组l中相同位置处的整数的函数f,其中f是该过程的计算复杂度.例如,f(i)= i ^ 2.因此,我希望所有流程都具有相同的计算成本,而不是让流程过早完成而其他流程永远持续.

最佳答案
让我们从一个非常弱的假设开始,类似的直方图以下面的基本方式定义:对于一组整数S1,如果sum(S1)= sum,则直方图H(S1)类似于集合S2的直方图H(S2) (S2).

通常,您在找到阵列A的子集S1,S2,…,SN之后使得f(S1)= f(S2)= … = f(SN),并且在我们的假设下f = sum.不幸的是你有一个k-Partition problem,这是NP难的,如果你有人找到一个有效的方式(即多时间)这样做,按照你的要求,后果将是P = NP是在stackoverflow上证明是真的!

转载注明原文:python – 将数组拆分为均匀分布的块 - 代码日志