【发布时间】:2016-08-29 19:08:25
【问题描述】:
问题陈述是:
给定一个整数数组,找到最大异或的子数组。
一些例子是:
Input: arr[] = {1, 2, 3, 4}
Output: 7
The subarray {3, 4} has maximum XOR value
Input: arr[] = {8, 1, 2, 12, 7, 6}
Output: 15
The subarray {1, 2, 12} has maximum XOR value
我找到了quora post,它提供了对问题解决方案的解释,但我不太能够完全理解所解释的内容。
文章一开始就引入了与上一个类似的问题(文章中的问题1):
给定一个整数数组,我们必须找到两个异或最大的元素
然后它描述了一个可以处理两种类型查询的 trie 数据结构:
- 插入一个数字 X
- 给定一个 Y,找出 Y 与迄今为止已插入的所有数字的最大异或。 如果我们有这个数据结构,我们将在进行过程中插入整数,并通过第二种类型的查询,我们将找到最大的 XOR
假设我们的数字 Y 是 b1,b2...bn,其中 b1,b2.. 是二进制位。我们从 b1 开始。现在为了使 XOR 达到最大值,我们将在进行 XOR 后尝试将最高有效位设为 1。因此,如果 b1 为 0,我们将需要 1,反之亦然。在 trie 中,我们转到所需的位边。如果没有有利的选择,我们会去另一边。对 i=1 到 n 重新执行此操作,我们将获得可能的最大 XOR。
这里有几点令人困惑。一个是:trie 究竟是如何用于找到与数组中当前点具有最大 XOR 的两个元素的?他们似乎在说这样的话:
例如 array= {1,2,3,4},当前数字是 3 -> 0011(4 位表示)意味着 1 和 2 已经插入到 trie 中。到目前为止,最大异或应该是数字 1 和 2(产生 3)。使用帖子中提供的方法,似乎可以将 max xor 存储在一个变量中,这样当数组中的最后一个数字与 trie 的当前状态进行异或时(我假设它会有元素1,2 和 3 已经插入),该变量将具有迄今为止的最大值。 但是算法如何存储已异或的两个元素以产生最大值?
最后,应该将这种方法的逻辑应用于问题(帖子中的问题2):
给定一个整数数组,找到最大异或的子数组
这里提供了以下解决方案:
假设 F(L,R) 是从 L 到 R 的子数组的 XOR。 这里我们使用 F(L,R)=F(1,R) XOR F(1,L-1) 的性质。如何? 假设我们的具有最大 XOR 的子数组在位置 i 结束。现在,我们需要最大化 F(L,i) 即。 F(1,i) XOR F(1,L-1) 其中 L
我不太了解 F(L,R)=F(1,R) XOR F(1,L-1) 的性质。我在这里假设 R 是最大子数组的右边界,而 L 是它的左边界,但不清楚为什么 F(1,i) 需要与 F(1,L -1)。由此,问题 1 的逻辑将如何应用在这里?
我意识到这个问题很长,但由于问题是多方面的,似乎有必要包括问题的这些基本部分。
【问题讨论】:
-
为什么很难存储已异或的两个元素以产生当前最大值?只要有一个
max变量,以及arg1ToXorThatYieldsMax和arg2ToXorThatYieldsMax变量,并在更新max的同时更新它们。 -
第二个问题:见this possible duplicate。
-
@DanielWagner 我没有说这很难。该帖子没有提到他们如何在所描述的算法中存储这两个元素。
标签: arrays algorithm tree bit-manipulation trie