在数组中查找N个元素xor等于P.

时间:2015-11-14 12:51:34

标签: arrays algorithm combinatorics xor

我正在解决一个问题,我希望在这个问题中找到XOR等于N<20的数组中P个元素的组合数。

例如: 我们的数组是{2 4 5 2 7}

1)如果N = 2且P = 6,

答案是2(因为我们只能选择(2 x或4)= 6和(4 xor 2)= 6)

{ 2 4 5 2 7}或{2 4 5 2 7}

2)如果N = 3且P = 6

答案是1((4 x或5 x或7)= 6)

数组的大小可能非常大(大约10 ^ 6)所以我正在寻找快速算法来解决这个问题。

2 个答案:

答案 0 :(得分:1)

编辑无效,因为N已修复

使用线性代数:

根据@blazs的建议,您可以在Z / 2Z向量空间中查看P和每个数组的数字作为向量。更重要的是,由于XOR是关联的和可交换的,你不是在寻找数组元素的组合,而是设置这些元素,并且一个集合也可以编码为一个Z / 2Z矢量。

所以你最终会得到像M * S = P这样的矩阵方程,其中P是Z / 2Z矢量格式的xor-sum,M是矩阵,其中列是Z中数组的元素/ 2Z格式,S是等式的未知数。

由于您只对解决方案空间的大小感兴趣,所以您需要做的就是找到解决方案空间的维度,然后将其提升2。

答案 1 :(得分:0)

建议的递归算法,可能比蛮力更快:

找到P的一位,即1.任何解决方案组合必须包含至少一个在该位中具有1的数字。

对于在该位上具有1的数组的每个元素K,重复:

  • P'= P xor K (xor - substraction)
  • arr'= arr - {arr中的J集合,其中该位为1,哪个索引小于或等于K} (因为我们假设K是组合的第一个元素解决方案空间中此位置为1)
  • N = N - 1

终止案件:

  • 如果P = 0,并且N = 0,则一个解决方案
  • 如果N = 0且P!= 0,则无解
  • 如果arr为空,则无解
  • 如果有一个P有一个1并且没有arr的元素,那么没有解决方案

请注意,XOR是关联的和可交换的,所以我们计算集合,而不是组合。