数组中两个元素的最大异或

Posted

技术标签:

【中文标题】数组中两个元素的最大异或【英文标题】:Max XOR of two elements in an array 【发布时间】:2019-06-02 08:38:28 【问题描述】:

我一直在寻找一些有效的算法来计算通过对数组的任意两个值进行异或运算可以获得的最大异或值。

例如,如果 i 和 j 是数组的索引,那么您必须最大化 (Ai xor Aj)...

我发现了两种有效的方法,其中一种使用尝试,另一种算法是我在 LeetCode 上发现的,它承诺结果为 O(nlog(U)) U 是数组元素中的位数。

这个算法工作正常但是,我在理解它为什么以及如何工作时遇到了问题。

这里是代码sn-p

int findMaximumXOR(vector<int>& nums) 
    int mask = 0;
    int test_max = 0;
    int max = 0;
    unordered_set<int> s;
    for(long long i = 30; i >= 0; --i)
        mask |= 1ll << i;

        printf("\n"BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(mask));

        for(int num : nums)
            s.insert(num & mask);
        

        test_max = max | 1 << i;
        for(int s_val : s)
            if(s.find(s_val ^ test_max) != s.end())
                max = test_max;
                break;
            
        
        s.clear();
    
    return max;

** 已经有一个关于 stack-overflow 的同名问题,但他们只讨论了尝试方法

【问题讨论】:

什么是“两个数的最大异或可能”? 通过对数组的任意两个值进行异或运算可以获得最大异或值。比如如果 i 和 j 是索引而不是你必须最大化(Ai xor Aj) 【参考方案1】:

该函数计算由 XOR(a,b) 表示的最大数。 为了计算这一点,它从最高位到最低位。 在第一次迭代中,它检查是否存在最高有效位不同的数字。在每次迭代之后,它保持两个数字之间前缀的最大异或,然后检查是否有两个数字具有该距离并且下一位也不同。 s 是一组数字的前缀,test_max 是前缀的最大异或。 本节:

test_max = max | 1 << i;
for(int s_val : s)
    if(s.find(s_val ^ test_max) != s.end())
        max = test_max;
        break;
    

尝试通过检查是否有两个数字保持最大 XOR 前缀并且也相差下一位来将前缀增加一位。 编辑: 据我从代码中了解到,Max XOR 最大为(int)(a[i]^a[j])

【讨论】:

以上是关于数组中两个元素的最大异或的主要内容,如果未能解决你的问题,请参考以下文章

[Leetcode421](python): 数组中两个数之间最大的异或值

LeetCode 421. 数组中两个数的最大异或值

与数组中元素的最大异或值(字典树)(小于等于某元素的最大异或值)

LeetCode1707. 与数组中元素的最大异或值 (字典树)/ 990. 等式方程的可满足性(并查集)

LeetCode﹝前缀树ி﹞最长单词键值映射最大异或值

LeetCode每日一题——1707. 与数组中元素的最大异或值(字典树)