【问题标题】:Effective ways to implement Every-to-Every interaction?实施 Every-to-Every 交互的有效方法?
【发布时间】:2010-02-18 13:22:23
【问题描述】:

给定一个元素列表,如果每个元素都需要了解该列表中每个其他元素的状态,如何处理所有元素?

例如,在 Python 中直接实现它的方法可能是:

S = [1,2,3,4]
for e in S:
  for j in S:
    if e!=j:
      process_it(e,j)

但是如果元素数量很大,它会非常慢 O(n²)。必须有另一种有效的方法,也涉及并发。你能帮帮我吗?

【问题讨论】:

  • 如果你的起始算法是 O(n^2) 并且你可以简化它,那就去吧。实现语言问题与此正交。
  • 如前所述,没有通用的方法可以让这变得更好。现在也许元素实际上只需要知道一些其他元素或预先从所有元素计算的摘要信息。可能会走得更快。但是这个问题并没有提供足够的信息来推测正确的技巧可能是什么。

标签: python c algorithm parallel-processing


【解决方案1】:

如果您需要处理每一对项目,则有 O(n2) 对,因此您将不得不进行那么多调用!

如果您只需要组合 (ab, ac, bc),而不需要所有排列 (ab,ba,ac,ca,bc,cb),那么您可以这样做,将调用次数减半(并跳过if):

for idA,val in enumerate(items):
    for idB in range(0, idA):
        process_it(val,items[idB]) 

改进它的唯一方法是找到一种方法来分解您的process_it 例程,以便它可以在多对上工作。如果没有更多信息,我们无法提供太多建议。

【讨论】:

    【解决方案2】:

    以多进程方式处理给定任务的适用性取决于任务的性质以及各种子任务的相互依赖性(或缺乏依赖性), 不是关于子任务列表的生成方式
    换句话说,使用问题的措辞,通过涉及并发,这个问题的能力不会那么缓慢取决于 process_it() 方法是这样的事实:

    • 每次使用给定的一组参数调用它时,它都会产生完全相同的结果(直接和副作用)。 (这是多处理任务的典型案例)
    • 一系列调用的总体结果与该系列的顺序无关(这在多处理任务中有点奇怪)。

    而且它不取决于一系列对 process_it() 的调用的顺序是由列表的笛卡尔积产生的(问题的 Every-to-Every ) 或通过一些预先构建的列表或其他方式。

    此外,问题的复杂性(问题中的 O(n^2))不会因为问题以多进程方式处理而减少。事实上,多进程逻辑通常会引入额外的复杂性(以“支付”组织和提供多个线程并组合它们的结果);然而,这种增加的难度通常是问题的另一个数量级(比如常数,或者可能在 n 中是线性的),因此不会改变整体复杂性。

    无关与将进程拆分为多个异步子任务的能力无关,可能会降低问题的复杂性 strong>,正如其他一些答案所暗示的那样(例如,如果 process_it(a,b) 与 process_it(b,a) 相同,或者如果基础数据是这样的,首先对其进行排序可以减少 process_it 需要的次数被称为等)

    此外,虽然某些编程语言或库/环境可以更轻松地管理多处理,但问题通常与语言无关;也许 python 标签和说明性的 sn-p 以某种方式混淆了这个问题。

    【讨论】:

      【解决方案3】:

      一个确定的选择是让它在 FPGA 中实现并让它们同时工作。除此之外 - 如果没有例外并且真的 - 所有 - 需要 - 所有 -,而不是“有些人需要一些”,那么您将被判处标准方法。

      【讨论】:

        猜你喜欢
        • 2023-02-17
        • 2021-03-04
        • 2020-12-08
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 2022-12-02
        • 1970-01-01
        • 2022-01-20
        相关资源
        最近更新 更多