这是指对帖子的评论 - Sorting 10 million integers with 1 MB space Solution explanation - Programming Pearls
'每个计数器可以使用4位,而不是2个字节。如果您对计数器进行分组,您甚至可以降低此值,例如,如果您对3个计数器进行分组,那么10 * 10 * 10 = 1000个组合,并且您需要10位(= 1024个值)。'
由于我不是来自计算机科学背景,所以非常感谢帮助解释跟踪计数器背后的技术,只需1/2个字节。
答案 0 :(得分:0)
我们的想法是,您使用bit manipulation来利用这样一个事实,即您拥有的位数比表示您存储的各个值所需的位数多。当您使用本质上支持位操作的编程语言时,这是最实用的,例如C ++。
对于给定的整数,它需要log2(num)
位来表示binary中的值。作为推论,您可以使用2^n-1
确定可以存储在给定位数中的最大整数,其中n
是位数。因此,如果我们将自己限制为4位,那么我们可以表示的最大数字是15。
为简单起见,我们假设每个值中可用的位数为8(1个字节)。根据您的要求,我们将为每个存储值使用4位。此外,后面的代码将使用C ++。
这些常量将有助于计算。
const int PIECE_MASK_LOWER = 15 //All 4 lower bits set to 1
//NOTE: 15 = 2^0 + 2^1 + 2^2 + 2^3
const int VALUE_SIZE = 4 //We're using 4 bits for each value
使用bitwise AND逻辑仅提取所需值的位。按位AND逻辑给出一个值,其二进制表示包含1,其中两个的操作数都有1。
检索下方
val = compositeVal & PIECE_MASK_LOWER
检索上方
这与获得较低的一块相同;但是首先需要right-shift the bits,以便目标值的位在按位AND运算的正确位置。
val = (compositeVal >> VALUE_SIZE) & PIECE_MASK_LOWER
使用bitwise OR逻辑将要存储的值的位应用于要存储它的字节。按位OR逻辑给出一个结果,其二进制表示包含1,其中 的操作数为1。
存储较低的部分
compositeVal = compositeVal | val
存储上层
这与存储下部部分相同,除非您需要left-shift the bits,以便它们处于按位OR运算的位置。
compositeVal = compositeVal | (val << VALUE_SIZE)
注意:如果要覆盖复合值中的一个部分,则必须清除已存在的值。否则,按位OR运算将为您提供损坏的值。