数组中两个元素的最大XOR

时间:2019-06-02 08:38:28

标签: c++ algorithm bit-manipulation

我一直在寻找一种有效的算法来计算最大异或值,您可以通过对数组的任意两个值进行异或来获得最大异或值。例如,如果i和j是数组的索引,则您必须将其最大化(Ai xor Aj)...我发现了两种有效的方法之一,其中一种使用尝试,另一种是在LeetCode上找到的算法,该算法保证结果为O(nlog(U ))U是数组元素中的位数。该算法可以正常工作。但是,在理解其原因和工作方式时遇到了问题。

这是代码段

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;
}

**标题相同的堆栈溢出问题已经存在,但他们仅讨论了trys方法

1 个答案:

答案 0 :(得分:2)

该函数计算XOR(a,b)表示的最大数。 要计算此值,它是从最高有效位到最低位。 在第一次迭代中,它检查是否存在最高有效位不同的数字。每次迭代后,它将前缀的最大XOR保持在两个数字之间,然后检查是否有两个数字具有该距离并且在下一位上也有所不同。 s是数字前缀的集合,test_max是前缀的最大XOR。 本节:

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])