>我有三组大向量: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,您应该选择具有最小平均范数的集合。