动态递增数组每次添加元素后求最大异或值的优化方法问询
动态数组下的最大异或值优化方案
当然有更快的实现方式,而且你提到的静态数组O(nlogM)解法(M为整数的二进制位数)完全可以适配到动态添加元素的场景,整体时间复杂度能降到O(nlogM),远优于O(n²/2)的暴力解法。下面具体讲两种可行的适配思路:
一、基于二进制前缀树(Trie)的动态实现
这是静态场景中最常用的解法,适配动态场景非常直接:
- 核心思路:维护一棵存储已插入数二进制前缀的树(从最高位到最低位),每个节点包含0、1两个子节点,分别对应二进制位的两种可能。
- 操作步骤:
- 插入新数:将当前数的二进制位从最高位到最低位依次插入前缀树中,不存在的节点则创建。
- 计算当前最大异或值:插入完成后,用当前数的每一位去前缀树中找相反的位(异或结果为1时数值更大),逐位计算能得到的最大异或值,再和之前记录的全局最大值比较,更新后输出。
- 示例对应过程:
- 插入第一个数
3:数组只有一个元素,输出0。 - 插入
2:在树中找与2(二进制10)每一位相反的路径,计算得3^2=1,输出1。 - 插入
5(二进制101):在树中找相反位路径,计算得5^2=7,更新全局最大值为7,输出7。 - 插入第二个
2:查询后发现最大异或值还是7,输出7。
- 插入第一个数
- 复杂度:每次插入和查询都只需要遍历整数的二进制位数(比如32位/64位),时间复杂度为O(logM)。
二、基于哈希表的贪心动态实现
静态场景的哈希贪心思路也能适配动态场景,核心是逐步确定最大异或值的每一位:
- 核心思路:维护一个存储所有已插入数的集合,以及当前的全局最大异或值。每次插入新数后,从最高位到最低位尝试扩展当前的最大异或值,检查是否存在已插入的数能和新数组合出更大的异或结果。
- 操作步骤:
- 插入新数:将新数加入哈希集合。
- 更新全局最大异或值:从最高位开始,尝试将当前最大异或值的该位设为1,得到候选值;检查是否存在集合中的数
x,使得x ^ 新数的前缀能匹配这个候选值。如果可以,就保留该位为1,否则保持原状态。遍历完所有位后,得到新的全局最大值并输出。
- 复杂度:每次更新最大值的过程只需要遍历二进制位数,时间复杂度同样为O(logM)。
两种方案对比
- 前缀树实现更直观,适合需要频繁查询的场景,但需要额外的树结构存储。
- 哈希表实现代码更简洁,空间开销相对小,但需要对贪心逻辑有清晰理解。
内容的提问来源于stack exchange,提问作者amoonra
相关产品推荐
相关产品推荐

