从列表中查找具有最小XOR值的对

pra*_*een 9 algorithm data-structures

我正在研究一个问题,在这个问题中,我希望得到数组中所有整数对的xor,然后找到从xor'ing产生的K个最小整数.阵列的大小可以是N = 100000,因此K可以非常大但限制为250000.

例如,如果N = 5且K = 4,

我们的阵列是 {1 3 2 4 2}

xoring(1和3,1-2,1-4,1-2,3-2,3-4,3-2等)产生的数字

3 3 2 5 0 1 6 1 6 7
Run Code Online (Sandbox Code Playgroud)

由于K = 4,我们必须打印4个最小的整数.所以答案是0 1 1 2.

由于时间限制是2秒并且非常紧张,因此使用挖掘所有数字的强力方法会超时.我的做法是错的,所以我需要帮助.也许我们可以利用K = 250000的限制,并想知道是否有可能得到K个最小的数字而不用xoring所有的整数.

Nei*_*eil 5

(x ^ y) == (x | y) - (x & y) >= |y - x|
Run Code Online (Sandbox Code Playgroud)

按顺序对数字进行排序将是一个开始,因为对之间的差异将给出xor的下限,因此是何时停止寻找xor x的数字的截止点.

还有一个快捷方式寻找对数字,其异或小于(说)2的幂,因为你只能在X <= Y <= X感兴趣| (2 ^ N - 1).如果这没有给你足够的对,增加N并再试一次.

编辑:您当然可以通过使用x |排除已经找到的xor小于之前2的幂的数字对.(2 ^(N - 1) - 1)<y <= x | (2 ^ N) - 1.

基于(已排序)[1,2,2,3,4]的示例

首先查找xor小于1的数字对:对于每个数字x,搜索后续数字y = x.这给出了{2,2}.

如果你需要不止一对,找对数字,其异或小于2,但不低于1:每个数x,搜索数字X <Y <= X | 这给了{2,3}(两次).

请注意,最终的xor值未完全排序,但每个批次严格小于上一批次.

如果您需要更多,请查找xor小于4但不小于2的数字对:对于每个数字x,搜索数字x | 1 <y <= x | 这给出了{1,2}(两次); {1,3}.

如果您需要更多,请查找xor小于8但不小于4的数字对:对于每个数字x,搜索数字x | 3 <y <= x | 这给出了{1,4}; {2,4}(两次); {3,4}.

  • 我不知道为什么。如果两个数字仅相差 1 位,它仍然可以是 MSB,并且它们的 XOR 将相当大。 (2认同)