或成对XOR

时间:2014-03-18 18:11:04

标签: algorithm

任何人都可以建议我使用O(n)算法OR对N个数字进行成对XOR操作的结果,例如让N=3和数字为5,79

5 ^ 7 = 2,  7 ^ 9 = 14,  9 ^ 5 = 12
2|14|12 = 14

^ for XOR操作和| for OR操作

2 个答案:

答案 0 :(得分:7)

如果A[i]A[j]中的k不同,那么:< A[i]A[1]中的k不同 - 位数为
A[j]A[1]中的k不同 所以,N次操作就足够了:

// A[i] = array of source numbers, i=1..N
Result = 0
for i = 2 to N
    Result = Result OR (A[i] XOR A[1])
print(Result)

答案 1 :(得分:5)

这些位是独立的,因此您可以分别计算每个位的结果。

因此,给定一系列位,我们现在想要所有成对XOR的OR。如果至少有一个按位XOR为1,则OR为1。如果输入序列中至少有一个0且至少有一个,则情况如此。很容易检查是否是这种情况。

总时间: O(wN)其中w是任何输入数字的最大位长。

假设 w 小于字大小,我们也可以在 O(N)中解决它:只需并行求解所有位:

have_one = 0
have_zero = 0
for x in input:
    have_one |= x
    have_zero |= ~x
return have_one & have_zero

have_one恰好设置在输入中某处有1的位置。 have_zero恰好设置在输入中某处为0的位置。对于那两种情况,结果都是1。