Algorithm 最大xor与最接近的数字

Algorithm 最大xor与最接近的数字,algorithm,max,xor,Algorithm,Max,Xor,如果我有一个正整数的列表L,并且我得到了另一个数字K,我需要在列表中找到K的异或最大的数字 我想到了一个算法。我想用反参数来验证它的正确性。我的算法是: 查找P=K的补码(1的补码)。现在在列表L中找到最接近P的数字。让这个数字为N。K和N的XOR将是最大值。 在给定的一组数字中,与一个数字I最接近的数字是一个与I的差值最小的数字 比方说,对于列表L中大于p的数字是不正确的。但是,对数字来说,编码和运行明显的暴力算法所花费的时间远少于您在这方面所花费的时间,这难道不正确吗。编码和运行明显的暴

如果我有一个正整数的列表
L
,并且我得到了另一个数字
K
,我需要在列表中找到
K
的异或最大的数字

我想到了一个算法。我想用反参数来验证它的正确性。我的算法是:

  • 查找
    P
    =K的补码(1的补码)。现在在列表L中找到最接近P的数字。让这个数字为N。K和N的XOR将是最大值。
  • 在给定的一组数字中,与一个数字
    I
    最接近的数字是一个与I的差值最小的数字

比方说,对于列表
L
中大于
p
的数字是不正确的。但是,对数字来说,编码和运行明显的暴力算法所花费的时间远少于您在这方面所花费的时间,这难道不正确吗。

编码和运行明显的暴力算法所花费的时间远少于您在这方面所花费的时间。

不,不正确

K=0011
,这样
p=1100
。让
L={00111100}
。您的算法将选择
N=1100
,这显然是不正确的,因为
N^K=0
,而
0011^N=3
不正确


K=0011
,这样
p=1100
。让
L={00111100}
。您的算法将选择
N=1100
,这显然是不正确的,因为
N^K=0
,而
0011^N=3
,我认为您需要一个名为

考虑一下
K
的每一位,从高到低,当然,当我们确定这一位答案是否可以是
1
时,我们可能会贪婪,我的意思是,首先你尽力得到
1024
(甚至更高),然后是
512
,然后是
256
,然后……最后是最后一位
1

因此,首先您需要检查列表中的某个数字在最高位是否与
K
的值相反,然后在所有选择的数字中,您需要在第二高位找到与
K
的值相反的数字


现在解决方案很明显,用
L
构建一个
Trie
,从高到低确定答案的位,这对应于树上的行程。

我认为您需要一个名为

考虑一下
K
的每一位,从高到低,当然,当我们确定这一位答案是否可以是
1
时,我们可能会贪婪,我的意思是,首先你尽力得到
1024
(甚至更高),然后是
512
,然后是
256
,然后……最后是最后一位
1

因此,首先您需要检查列表中的某个数字在最高位是否与
K
的值相反,然后在所有选择的数字中,您需要在第二高位找到与
K
的值相反的数字



现在解决方案显而易见了,用
L
构建一个
Trie
,从高到低确定答案的位,这对应于树上的移动。

最接近什么,最接近数字?那么它当然是假的。@nneonneo请检查edit@user1708762当前位置不,它不会工作。我记得我做过一个编程问题,这种方法在某些情况下给出了错误的答案。不过,我现在不想麻烦构造反例。@user1708762:在二进制中,K=0000 1011-->P=1111 0100,L={0000,1000,0000 0100,0000 0011}。您将最终选择3(0000 0011),因为它与P(负数)的差值较小。最接近的数值是多少?那么它当然是假的。@nneonneo请检查edit@user1708762当前位置不,它不会工作。我记得我做过一个编程问题,这种方法在某些情况下给出了错误的答案。不过,我现在不想麻烦构造反例。@user1708762:在二进制中,K=0000 1011-->P=1111 0100,L={0000,1000,0000 0100,0000 0011}。你最终会选择3(0000 0011),因为它与P(负数)的差异较小。通常,优化的目的是让它始终运行得很快,而不是让它一次运行得很快。我没有看到任何关于优化的提及。无论如何,XOR在几乎任何体系结构上都是盲目快速的——试图削减一些CPU周期是毫无意义的。当然,但是你可以制作一个算法,对
L
进行预处理,使所有针对
L
的查询都非常快速(例如
log(N)
快速)。这种算法在某些类型的问题中可能非常关键(例如,针对大型固定位集集合的多个最大子集搜索)。在这种情况下,即使XOR很快,10000个
O(log(N))
查询也会击败10000个
O(N)
查询以获得足够大的
N
@WaywiserTundish:如果数字是任意的,那么您的答案实际上是一个很好的解决方案。这是一个糟糕的解决方案的一种情况是,当列表被定义为一个连续的数字范围,定义为上限和下限。我们没有被告知L或K的任何特殊属性。在没有进一步信息的情况下,必须假设任意输入。如果你能找到一个随机整数L的算法,其中运行时间不受排序或峰值查找函数的支配,我将购买下一轮。通常,优化的目的是让它始终快速运行,而不是让它快速运行一次。我没有看到任何关于优化的提及。无论如何,XOR在几乎任何体系结构上都是盲目快速的——试图削减一些CPU周期是毫无意义的。当然,但是你可以制作一个算法,对
L
进行预处理,使所有针对
L
的查询都非常快速(例如
log(N)
快速)。这种算法在某些情况下可能是至关重要的