如何使此向量枚举代码更快



>我有三组大向量:A、B1 和 B2。这些集存储在磁盘上的文件中。对于来自 A 的每个向量 a,我需要检查它是否可以呈现为 a = b1 + b2,其中 b1 来自 B1,b2 来自 B2。向量有 20 个分量,所有分量都是非负数。

我现在如何解决这个问题(伪代码):

foreach a in A  
  foreach b1 in B1
    for i = 1 to 20
      bt[i] = a[i] - b1[i]
      if bt[i] < 0 then try next b1
    next i
    foreach b2 in B2
      for i = 1 to 20
        if bt[i] != b2[i] then try next b2
      next i
      num_of_expansions++
    next b2
  next b1
next a

我的问题:
1.关于如何使它更快的任何想法?
2. 如何并行?
3. 问题 1、2 适用于我有 B1、B2、...、Bk、k> 2 的情况?

您可以按规范对 B1 和 B2 进行排序。如果 a = b1 + b2,则 ||a||= ||B1 + B2||<= ||B1||+ ||b2||,因此对于任何 a 和 b1,您可以有效地消除 B2 中具有范数

至于并行,似乎每个循环都可以变成并行计算,因为一个内部迭代的所有计算都独立于所有其他迭代。

编辑

继续分析:由于 b2 = a - b1,我们也有 ||B2||<= ||a||+ ||B1||.因此,对于任何给定的 a 和 b1,您可以将 B2 中的搜索限制为规范范围为 ||a||± ||B1||.这表明对于 B1,您应该选择具有最小平均范数的集合。

最新更新