我有三组大的矢量: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.对于我有B1,B2,...,Bk,k&gt;的情况的问题1,2。 2?
答案 0 :(得分:1)
您可以按规范对B1和B2进行排序。如果a = b1 + b2,那么|| a || = || b1 + b2 || &lt; = || b1 || + || b2 ||,因此对于任何a和b1,您可以有效地消除具有norm&lt;的所有B2元素。 ||一个|| - || b1 ||。可能还有一些方法可以使用B1和B2中的规范分布来决定是否在这里切换两组的角色。 (我没有看到如何做到这一点,但在我看来,如果B1和B2中的规范分布明显不同,那么这样的事情应该成立。)
至于使其并行,似乎每个循环都可以转换为并行计算,因为一个内部迭代的所有计算都独立于所有其他迭代。
修改强>
继续分析:由于b2 = a - b1,我们也有|| b2 || &lt; = || a || + || b1 ||。因此,对于任何给定的a和b1,您可以将B2中的搜索限制为具有|| a ||范围内的范数的元素。 ±|| b1 ||。这表明对于B1,您应该选择具有最小平均范数的集合。