在一次采访中我被问到以下问题。
给出具有 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]
答案 0 :(得分:3)
关键概念是通过匹配尽可能多的最高有效位将XOR最小化。例如,当 A 中的值是
时,考虑B [x] = 41 0001
2 0010
3 0011
6 0110
9 1001
4的二进制模式为0100
。因此,我们正在寻找一个以0开头的数字。这消除了9,因为9的最高有效位为1。接下来,我们在第二位寻找1。 01
仅以6开头,因此6是4的最佳匹配。
为了有效解决问题,我将A的元素放入trie中。
使用问题中的示例,特里看起来像这样。 (请注意,通过允许在Trie中使用更高的叶节点,可以节省内存并提高速度,但这会使Trie的构造变得复杂。)
一旦树被构造,就很容易查找任何B [x]的答案。只需遵循从根开始的位模式即可。对于具有两个子节点的节点,请转到与当前位匹配的子节点。对于有一个孩子的节点,别无选择,所以去那个孩子。找到叶子后,便是答案。
运行时间为O(k(N + M)),其中k
是 A 中最大位数的位数。
在示例中,k
是4。