我想知道一个算法来找出数组中三个元素的最大xor值。 我已经从数组中读到了maximum xor for two elements,但是无法理解如何应用它来查找数组的3个元素的XOR的最大值。有人可以指出一个暗示吗?
所需的复杂性:小于 O(N ^ 3),其中 N 是数组中元素的数量。
示例:
A = [1,2,3,4]
所有可能的三胞胎: -
1 ^ 2 ^ 3 = 0
1 ^ 2 ^ 4 = 7
1 ^ 3 ^ 4 = 6
2 ^ 3 ^ 4 = 5
因此,最大XOR值为7.
修改:
我想到了一个复杂度 O(N ^ 2 * log(MAX))的解决方案,它已经解决了我的目的:D。
MAX =数组中的最大值
答案 0 :(得分:6)
好吧,我找到了一个复杂度 O(N ^ 2 * log(MAX))的解决方案,其中MAX是数组中的最大值。
让阵列 A 中有3个元素 X,Y,Z 。
其中 X = A [i],Y = A [j],Z = A [k] 且 i!= j!= k
我们想要(X ^ Y ^ Z)的最大值。
我们假设 W = X * Y 。
然后我们希望找到一个 Z ,它为 W ^ Z 和 Z!= X 和提供最大值Z!= Y
现在这已经减少到找到“Two elements whose XOR is maximum”的问题,可以在 O(log(MAX))中给定 W 使用 Trie 。
对Trie的解释:
我们假设 W = 10001 这里 W是二进制。
现在我们知道 1 ^ 0 = 1,0 ^ 0 = 0,1 ^ 1 = 0 ,所以最大值我们 可以得到 W ^ Z 是Z是 01110 因为 W ^ Z将给出= 11111 。
但我们的数组中没有必要 15或Base2(11111) 我们会尽可能选择最好的选择。
因此,我们将创建数组所有元素的 Trie 根据他们的二进制表示。
如果 A = [1,2,7] ,则 1 = 001 , 2 = 010 , 7 = 111 in 二进制。
然后Trie看起来像: -
Top / \ 0 1 / \ \ 0 1 1 \ / \ 1 0 1
现在让我们假设 W = 7 ,我们想找到 Z 这样的 W ^ Z 是最大(当Z = 000时)然后我们将从Top开始,看看我们是否有分支导致0,因为7的第一位是1 ,然后我们将通过该分支,然后再看看我们是否有 分支在第2位导致0,再次我们找到它,然后是最后一位 我们在第3位搜索分支导致0的时间,但我们找不到 它,所以我们通过另一个分支,它给我们 Z = 001 即可。因此,最大 W ^ Z将是7 ^ 1 = 6 。现在 发现 Z 的复杂性将是 Trie 的最大高度 将是 log(MAX)。
因此,我们有 N *(N-1)/ 2 W 的数量,而对于每个 W ,我们可以找到最大值 W ^ Z ,如果我们从 W ^ Z 的所有值中取最大值,我们将得到答案。
答案 1 :(得分:0)
有三个嵌套循环:
int max2=0,max3=0;
for (int i=0;i<arr.size();i++)
for (int j=0;j<arr.size();j++)
for (int k=0;k<arr.size();k++)
{
if (arr[i]^arr[j]>max2) // for 2 elements
max2 = arr[i]^arr[j];
if (arr[i]^arr[j]^arr[k]>max3) // for 3 elements
max3 = arr[i]^arr[j]^arr[k];
}
int max = max2; // for both
if (max3>max2)
max = max3;
答案 2 :(得分:0)
下面将做O(N ^ 3),但是采用更优化的方法 - 不是多次测试相同的组合,而不是测试元素对抗自身, 并且稍微优化了评估(为所有可能的第三元素分配前两个元素)
执行的Xor操作数量为: n(n-1)(n-2)/ 6 + n(n-1)/ 2
复杂性仍然是n(n-1)(n-2)/ 6 ===&gt; O(N ^ 3)虽然。
unsigned int maxXor3(unsigned int* element, int len)
{
unsigned int max = 0;
unsigned int xor2 = 0;
unsigned int xor3 = 0;
int j = k = 0;
for (int i = 0 ; i < len ; i++)
{
for (j = i + 1 ; j < len ; j++)
{
xor2 = element[i] ^ element[j];
for(k = j + 1; k < len; k++)
{
xor3 = xor2 ^ element[k];
if (xor3 > max)
max = xor3;
}
}
}
return max;
}