或者通过取列表中所有数字的xor形成的所有对。

时间:2015-04-21 20:38:10

标签: algorithm xor bits

或者通过取列表中所有数字的xor形成的所有对。

例如:10,15,17

ans =(10 ^ 15)|(15 ^ 17)|(10 ^ 17)= 31。我做了一个o(n * k)算法,但需要更好的东西(n是条目数,k是每个数字中的位数。)

1 个答案:

答案 0 :(得分:4)

在这里考虑否定可能是最容易的。

XOR基本上“不等于” - 即,当且仅当两个输入位彼此不相等时,它才产生1的结果。

由于您正在将所有这些结果进行OR运算,这意味着如果至少有两个输入在该位位置具有不同的值,则结果中会得到1位。

反过来,这意味着我们在结果中得到零,其中每个输入在该位位置具有相同的值。

计算我们可以积累两个中间值。首先,我们和所有输入一起。这将为我们提供每个输入都有一个位置的位置。另一方面,我们将每个输入反转,并将所有这些结果与AND反转。这将告诉我们所有输入值为0的每个位置。

或者那些在一起,我们有一个值为1,其中每个输入相等,否则为零。

反转,我们得到所需的结果:0表示所有输入相等,1表示任何不同。

这让我们可以用线性复杂度计算结果(假设每个输入值都适合单个单词)。