我一直在寻找一种有效的算法来计算最大异或值,您可以通过对数组的任意两个值进行异或来获得最大异或值。例如,如果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方法
答案 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])
。