查询的最小XOR

时间:2019-12-03 21:40:14

标签: python algorithm sorting bit-manipulation xor

在一次采访中我被问到以下问题。

给出具有 N 个元素的数组 A 和具有 M 个元素的数组 B 。对于每个B [X],返回A [I],其中A [I]和B [X]的异或最小。

例如:

输入

data = inf.readlines()

输出

A = [3, 2, 9, 6, 1]
B = [4, 8, 5, 9]

因为对4中的任何元素与4进行异或运算,所以当A [I] = 6时将出现最小值

[6, 9, 6, 9]

这是我在python中的强力解决方案。

4 ^ 3 = 7
4 ^ 2 = 6
4 ^ 9 = 13
4 ^ 6 = 2
4 ^ 1 = 5

关于如何解决O(MxN)以下时间复杂度的任何想法?

我有以下想法。 我将以O(NlogN)的时间对数组A进行排序,然后对B中的每个元素进行排序。我会尝试使用二进制搜索将其放置在数组A中。假设B [X]会适合A中的第i个位置,检查def get_min_xor(A, B): ans = [] for val_b in B: min_xor = val_b ^ A[0] for val_a in A: min_xor = min(min_xor, val_b ^ val_a) # print("{} ^ {} = {}".format(val_b, val_a, val_b ^ val_a)) ans.append(min_xor ^ val_b) return ans B[X] ^ A[i-1]的最小XOR。但是这种方法并非在所有情况下都有效。例如以下输入

B[X] ^ A[i+1]

输出:

A = [1,2,3]
B = [2, 5, 8]

这是特里解决方案。

[2, 1, 1]

1 个答案:

答案 0 :(得分:3)

关键概念是通过匹配尽可能多的最高有效位将XOR最小化。例如,当 A 中的值是

时,考虑B [x] = 4
1  0001
2  0010
3  0011
6  0110
9  1001

4的二进制模式为0100。因此,我们正在寻找一个以0开头的数字。这消除了9,因为9的最高有效位为1。接下来,我们在第二位寻找1。 01仅以6开头,因此6是4的最佳匹配。

为了有效解决问题,我将A的元素放入trie中。

使用问题中的示例,特里看起来像这样。 (请注意,通过允许在Trie中使用更高的叶节点,可以节省内存并提高速度,但这会使Trie的构造变得复杂。)

enter image description here

一旦树被构造,就很容易查找任何B [x]的答案。只需遵循从根开始的位模式即可。对于具有两个子节点的节点,请转到与当前位匹配的子节点。对于有一个孩子的节点,别无选择,所以去那个孩子。找到叶子后,便是答案。

运行时间为O(k(N + M)),其中k A 中最大位数的位数。
在示例中,k是4。