【问题标题】:Split array into evenly-distributed chunks将数组拆分为均匀分布的块
【发布时间】:2014-04-04 11:59:18
【问题描述】:

我正在寻找一种将数组拆分为具有相似直方图的块的有效方法。

例如,给定数组:

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。因此,我希望所有进程都具有相同的计算成本,并且不要让进程过早完成而其他进程永远持续下去。

【问题讨论】:

  • 请分享你如何得到上面的c1、c2和c3。
  • 终于,终于。谢谢你,先生,提供了一个minimal的例子。
  • @mskimm:我是手动完成的。获得它们的方法正是我要问的......
  • 如果您需要并行化一系列作业。为什么不能将原始数组用作所有工作人员的队列?
  • @M4rtini:是的,原因是我使用的是Condor(分布式计算框架),所以我没有任务池。我需要事先指定任务(在将作业提交到 Condor 的服务器之前)。

标签: python algorithm numpy


【解决方案1】:

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

通常你在找到数组 A 的子集 S1, S2, ..., SN 使得f(S1) = f(S2) = ... = f(SN),以及在我们的假设下f=sum .不幸的是,你有一个 k-Partition problem,这是 NP 难的,如果你能让某人按照你的要求找到一种有效的方法(即多时间)来做到这一点,结果是P=NP首先在stackoverflow上被证明是真的!

【讨论】:

  • 我认为我不需要这么精确的分区。我可以放松这个问题并有一些近似值。例如,我可以循环(以某种巧妙的方式)通过排序列表以均匀分布在一组块上。因此,例如:l= [20, 19, 7, 7, 4, 3, 2, 1, 1] --> c1 = [20, 3, 2], c2 = [19, 4, 1], c3 = [7, 7, 1]。在这里,我每 3 步更改了分配块的方向。你怎么看?
  • @Kits89 放松问题和进行多时间近似是不同的事情。可能是在您放松问题后,有一个多项式解决方案,无需近似,并且当某些条件或假设发生变化时,许多 NP-hard 问题变成多项式。除此之外,您可以从这里开始 3-PARTITION:mathoverflow.net/questions/82332/… 并按照链接查看是否可以针对您的特定情况调整近似值。
猜你喜欢
  • 1970-01-01
  • 2013-05-27
  • 2011-04-04
  • 1970-01-01
  • 2014-02-16
  • 2017-01-09
  • 2013-03-25
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多