我正在解决一个问题,在这个问题中,我需要对数组中的所有整数对进行xor运算,然后找到通过xor运算产生的K个最小整数。数组的大小可以是N=100000,因此K可以非常大,但限制为250000。
例如,如果N=5和K=4,
我们的数组是{1 3 2 4 2}
异或运算得到的数字(1和3,1-2,1-4,1-2,3-2,3-4,3-2等)
3 3 2 5 0 1 6 1 6 7
由于K=4,我们必须打印4个最小的整数。所以答案是0 1 1 2。
由于时间限制是2秒并且非常紧凑,所以使用暴力方法对所有数字进行异或操作将会超时。我的方法是错误的,所以我需要帮助。也许我们可以利用K=250000的限制,并想知道是否有可能在不对所有整数进行异或运算的情况下获得K个最小数字。
发布于 2012-03-02 06:17:21
(x ^ y) == (x | y) - (x & y) >= |y - x|
按顺序对数字进行排序将是一个开始,因为这些对之间的差异将给您提供xor的下限,因此也是何时停止查找要与x进行xor的数字的分界点。
还有一种快捷方式可以查找xor小于(比方说) 2的幂的数字对,因为您只对x <= y <= x|(2^N- 1)感兴趣。如果这不能为您提供足够的对,请增加N,然后重试。
编辑:当然,您可以使用x|(2^ (N - 1) - 1)
基于(排序) 1、2、2、3、4的示例
首先查找xor小于1的数字对:对于每个数字x,搜索后续数字y= x。这将得到{2,2}。
如果您需要多个数字对,请查找xor小于2但不小于1的数字对:对于每个数字x,搜索数字x
请注意,最终的XOR值并没有完全排序,但每一批都严格小于前一批。
如果需要更多,请查找xor小于4但不小于2的数字对:对于每个数字x,搜索数字x|1
如果需要更多,请查找xor小于8但不小于4的数字对:对于每个数字x,搜索数字x|3
发布于 2012-03-02 06:09:07
我会首先对整数的输入数组进行排序。然后,具有最小XOR值的对将彼此相邻(但不是所有相邻对都具有最小XOR值)。您可以从相邻的配对开始,然后向外工作,检查配对(N,N+2),(N,N+3),直到您获得所需的K个最小结果列表。
对于示例数组{1 3 2 4 2}
,排序后的数组为{1 2 2 3 4}
,成对XOR值为:
1 xor 2 = 3
2 xor 2 = 0
2 xor 3 = 1
3 xor 4 = 7
对于下一步,
1 xor 2 = 3
2 xor 3 = 1
2 xor 4 = 6
再一次,
1 xor 3 = 2
2 xor 4 = 6
最后,
1 xor 4 = 5
这个想法并不完整,但您应该能够使用它来帮助构建一个完整的解决方案。
https://stackoverflow.com/questions/9524828
复制相似问题