深入理解 max_xor 的计算过程
在前面的解释中,我们使用了 max_xor 变量来逐步构建每对数的异或结果。你提到在处理数字2(0010)时,对于第1位和第0位,分别加上了 2^1 = 2 和 2^0 = 1,最终得到 max_xor = 3。下面,我们将详细解释这一过程,帮助你更好地理解 max_xor 的计算方式以及它与最终异或结果之间的关系。
基本概念回顾
二进制表示:
每个数字都可以表示为二进制串。例如:
数字1:0001
数字2:0010
数字3:0011
异或操作(XOR):
对应位相异时结果为1,相同时结果为0。
例如:1 ^ 2 = 3,因为 0001 ^ 0010 = 0011。
Trie的作用:
用于高效存储和查询二进制位,帮助我们在查找过程中尽可能选择与当前位相反的位,以最大化异或结果。
max_xor 的作用
max_xor 变量用于记录当前数字与Trie中某个数字异或后能得到的最大值。它通过逐位检查并选择最优的位(即尽可能与当前位相反的位)来构建这个最大值。
详细计算过程
让我们以数字2(0010)为例,详细解释 max_xor 的计算过程。
初始状态
当前数字:2 → 0010
Trie中已有的数字:1 → 0001
初始 max_xor:0
按位处理
我们从最高位(第3位)到最低位(第0位)依次处理每一位:
第3位(最左边,权值 2^3 = 8):
数字2的第3位:0
希望选择的位:1(因为0 ^ 1 = 1,能增加异或值)
Trie中第3位存在的位:0(只有数字1的第3位是0)
选择的位:0(因为1不存在)
max_xor 更新:保持不变(没有选择到1,所以当前位异或为0)
max_xor:0
第2位(权值 2^2 = 4):
数字2的第2位:0
希望选择的位:1
Trie中第2位存在的位:0(只有数字1的第2位是0)
选择的位:0(因为1不存在)
max_xor 更新:保持不变
max_xor:0
第1位(权值 2^1 = 2):
数字2的第1位:1
希望选择的位:0(因为1 ^ 0 = 1)
Trie中第1位存在的位:0 和 1(数字1的第1位是0)
选择的位:0(因为希望选择0以获得1的异或结果)
max_xor 更新:加上 2^1 = 2
max_xor:0 + 2 = 2
第0位(权值 2^0 = 1):
数字2的第0位:0
希望选择的位:1
Trie中第0位存在的位:1(数字1的第0位是1)
选择的位:1(因为希望选择1以获得1的异或结果)
max_xor 更新:加上 2^0 = 1
max_xor:2 + 1 = 3