首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从列表中查找XOR值最小的对

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

Stack Overflow用户
提问于 2012-03-02 05:59:36
回答 2查看 6.1K关注 0票数 9

我正在解决一个问题,在这个问题中,我需要对数组中的所有整数对进行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等)

代码语言:javascript
运行
复制
3 3 2 5 0 1 6 1 6 7

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

由于时间限制是2秒并且非常紧凑,所以使用暴力方法对所有数字进行异或操作将会超时。我的方法是错误的,所以我需要帮助。也许我们可以利用K=250000的限制,并想知道是否有可能在不对所有整数进行异或运算的情况下获得K个最小数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-02 06:17:21

代码语言:javascript
运行
复制
(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

票数 5
EN

Stack Overflow用户

发布于 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值为:

代码语言:javascript
运行
复制
1 xor 2 = 3
2 xor 2 = 0
2 xor 3 = 1
3 xor 4 = 7

对于下一步,

代码语言:javascript
运行
复制
1 xor 2 = 3
2 xor 3 = 1
2 xor 4 = 6

再一次,

代码语言:javascript
运行
复制
1 xor 3 = 2
2 xor 4 = 6

最后,

代码语言:javascript
运行
复制
1 xor 4 = 5

这个想法并不完整,但您应该能够使用它来帮助构建一个完整的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9524828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档