You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态递增数组每次添加元素后求最大异或值的优化方法问询

动态数组下的最大异或值优化方案

当然有更快的实现方式,而且你提到的静态数组O(nlogM)解法(M为整数的二进制位数)完全可以适配到动态添加元素的场景,整体时间复杂度能降到O(nlogM),远优于O(n²/2)的暴力解法。下面具体讲两种可行的适配思路:

一、基于二进制前缀树(Trie)的动态实现

这是静态场景中最常用的解法,适配动态场景非常直接:

  • 核心思路:维护一棵存储已插入数二进制前缀的树(从最高位到最低位),每个节点包含0、1两个子节点,分别对应二进制位的两种可能。
  • 操作步骤:
    1. 插入新数:将当前数的二进制位从最高位到最低位依次插入前缀树中,不存在的节点则创建。
    2. 计算当前最大异或值:插入完成后,用当前数的每一位去前缀树中找相反的位(异或结果为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. 插入新数:将新数加入哈希集合。
    2. 更新全局最大异或值:从最高位开始,尝试将当前最大异或值的该位设为1,得到候选值;检查是否存在集合中的数x,使得x ^ 新数的前缀能匹配这个候选值。如果可以,就保留该位为1,否则保持原状态。遍历完所有位后,得到新的全局最大值并输出。
  • 复杂度:每次更新最大值的过程只需要遍历二进制位数,时间复杂度同样为O(logM)。

两种方案对比

  • 前缀树实现更直观,适合需要频繁查询的场景,但需要额外的树结构存储。
  • 哈希表实现代码更简洁,空间开销相对小,但需要对贪心逻辑有清晰理解。

内容的提问来源于stack exchange,提问作者amoonra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:50:17