尽管您后来说您实际上有一个double
可用的存储信息,但我想我可能仍然会分享一些关于使用 32 位整数执行此操作的想法。
首先,为了让这些数字按得分顺序排列,时间顺序排在第二位,您希望得分占据较高值的位置,而时间戳占据较低的位置。要将分数放在较高值的位置,我们必须选择一个将它乘以某个常数因子。可以用无符号 32 位整数表示的最大数字是 4,294,967,295 ,我们的分数范围是 0 到 1,000,000。这给了我们 4,294 的乘数。
然后我们得到时间戳占据的较低值位置 - 只需将其添加进去。这给了我们:
N = SCORE * 4294 + TIMESTAMP;
反向转换为:
SCORE = N / 4294;
TIMESTAMP = N % 4294;
但是,请注意,这允许的范围TIMESTAMP
是 0 到 4293(包括 0 到 4293)。任何更高的东西都会溢出到N
被SCORE
. 如果TIMESTAMP
只是几秒钟(从 4293 开始的最早得分并倒计时),这只会给我们从最早得分到最新得分的最大时间超过 71 分钟 - 可能不够。
这只是对您可以用 32 位整数表示的不同存储桶数量的限制 - 为了能够使用此模型表示更多不同的时间戳,您需要减少可以表示的不同分数的数量。
但是,请注意,我们并不真正希望时间戳作为时间戳 - 我们只是希望它作为分数的单调排序。作为替代方案,我们可以保留一个柜台。将计数器初始化为 4293。当有新分数进入时,将其与计数器的当前值一起存储为它的“时间戳”,然后递减计数器。这将允许在计数器用完之前存储 4294 个不同的高分。
作为进一步的改进,我们可以注意到我们只关心相同SCORE
value内的排序。这提出了另一种选择:当出现新的高分时,找到该分数的当前最低 TIMESTAMP 值。将其减 1,并将其用作新分数的“时间戳”(如果这是第一次SCORE
提交,则使用 4293 作为时间戳)。这将允许每个个人得分值 4294 高分。