【发布时间】:2015-03-09 22:01:55
【问题描述】:
我目前正在执行使用两个堆查找中值的实现: No. 30 - Median in Stream
我了解一般的基本算法,但我不确定这个确切的实现是如何工作的。具体来说,我对这两行的作用感到非常困惑:
if(((minHeap.size() + maxHeap.size()) & 1) == 0)
....
if(size & 1 == 1)
我相信我理解按位与 - 它需要两个数字并以二进制形式输出一个数字。通过比较 == 0 或 == 1,它会逐位检查按位与是否分别输出 0 或 1。但是,在寻找中位数的情况下,这到底是做什么的?我知道保持堆“均匀”(并将中位数保持在两个堆之间)很重要,但除此之外我不完全确定。这真的只是一种检查尺寸是否不同的方法吗?
【问题讨论】:
-
x&1和x%2一样,都是检查x 是偶数还是奇数。 -
x & (n - 1) = x % n其中n是二的幂。 -
@tux3 - 是的,但请记住不要对有符号整数使用此技巧,因为“二的恭维”,逻辑会反转负数
-
@iwolf:负数的逻辑是如何反转的?例如,在 2 的补码中,
-7 & 1是1。而-7 % 2非零。 -
@MDragon00:永远不要使用
if(size & 1 == 1)!这意味着if(size & (1 == 1))。诚然,在这种情况下,这也是同样的事情;但只是偶然。