数组中的三个元素,其xor是最大的

时间:2013-09-29 06:00:31

标签: arrays algorithm bit-manipulation xor

我想知道一个算法来找出数组中三个元素的最大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 =数组中的最大值

3 个答案:

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