查找位向量与多个位向量的任何成对交集之间的最小汉明距离

计算科学 算法 Python 表现
2021-12-25 17:49:07

我正在寻找一种优化此过程的方法。这就是问题:

  • 我有一个位向量列表A=[a1,a2,a3,...,an]
  • 我有一个位向量列表B=[b1,b2,b3,...,bm]

对于每一个bB,我需要找到以下最小汉明距离:

min{x,yA:hammingd(xy,b)}

如果我们将popcount定义为一个计算位向量中1个数的函数:

min{x,yA:popcount(xyb)}

在 Python 伪代码中,它应该如下所示:

results = list()
for b in B:
    m = min(popcount((x & y) ^ b) for x in A for y in A)
    results.append(m)

A 和 B 都是包含 0 或 1 向量的列表。 & (and) 和 ^ (xor) 是应用于位向量的每个元素的操作。

有任何想法吗?

2个回答

这不是一个完整的答案,但有可能获得可能变成更有效解决方案的界限。例如,如果你有 b : 00001111 x : 01010101 ^ ^ 那么不管y你不会得到低于 2 的 popcountbx这种绑定部分解决方案的能力使我认为,在实践中,即使问题在最坏的情况下被证明是“困难的”,您也可以制作出比蛮力算法快得多的算法。

这是我会尝试的:

首先,计算 a 中的位unsigned int z,即“称重”它:

n = table[ (z & 0xffff) ] + table[ (z >> 16) ];

whereunsigned char table[1<<16];是提前填写的。

我试图看看是否有一种方法可以简化外循环,但 XOR 不会分布在 AND 上。