我正在寻找一种将数组拆分成具有类似直方图的块的有效方法。
例如,给定数组:
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
个子流程,但必须在每个子流程之间均匀分配成本。处理此列表中元素的成本是数组f
中相同位置的整数的函数l
,其中f是进程的计算复杂度。例如,f(i)=i^2
。因此,我希望所有流程都具有相同的计算成本,而不是让流程过早完成而其他流程永远持续。
答案 0 :(得分:2)
让我们从一个非常弱的假设开始,类似的直方图是按照以下基本方式定义的:对于一组整数 S1 ,直方图H(S1)
是类似于集合 S2的直方图H(S2)
sum(S1) = sum(S2)
。
一般情况下,您在查找数组 A 的子集 S1,S2,...,SN 之后f(S1) = f(S2) = ... = f(SN)
,并且在我们的假设下{ {1}}。不幸的是,你有一个 k-Partition problem ,这是NP难的,如果你有人找到一个有效的方式(即多时间)来做到这一点,就像你一样要求,结果是 stackoverflow 首先证明f=sum
是真的!