gpt4 book ai didi

c - 用单个数值表示前 10 名列表的方法

转载 作者:行者123 更新时间:2023-11-30 18:32:54 25 4
gpt4 key购买 nike

我有一个前 10 名的列表,其中包含分数(最高分获胜)和时间戳。

时间戳用于平局得分的情况,在这种情况下,具有最低时间戳的平局得分获胜(第一个获得得分较高的人)。

排序数据集示例:

20 102906755
15 102910755
14 102890755
14 102890756
13 102890756

请注意分数 14 上的平局,时间戳较小的分数排名靠前。

我需要以正确的顺序将分数和时间戳表示为单个 32 位值。

假设最高分数为 100 万。

我通过减去第一个有效日期分数来减少时间戳值。

如何用 C 语言实现这一点?

最佳答案

首先,如果您需要表示超过 2^32 种不同的分数与时间戳组合,那么游戏就结束了 - 无法完成。

考虑到这一点:

  • 分数真正需要多少位?如果最大分数是 100 万,则需要 20 位,这样可以均匀分布,只剩下 12 位作为时间戳。这将非常严格,尤其如果可能有超过 2^12 = 4000 个列表条目与单个分数相关,尽管分数分布大概不是甚至。
  • 时间戳到底需要多少位?
  • 您可以丢弃时间戳中的最高有效位吗?例如,如果您知道所有时间都在 2001 年之后,那么您可以将时间戳作为 2001 年而不是 1970 年的基础,这会增加 1 位。 [编辑:您似乎更改了时间戳,它们不再像原来那样看起来像 1970 年以来的秒]
  • 你能丢弃时间戳中不太重要的位吗?在您的示例数据中,您的时间戳仅相隔 1 秒,但这现实吗?如果有两行分数和时间戳都相等怎么办?想必这不是世界末日:如果 1 秒间隙是可能的,那么我想 0 秒间隙也是可能的。例如,如果将所有时间戳四舍五入到最接近的 32 秒,那么您可以获得 5 位,但代价是引入更多死联系。
  • 对于时间戳,您可以使用每次得分时递增一次的值,而不是自纪元以来的实际时间(以秒为单位)吗?如果是这样,那么您可能会节省很多位。您能否为每个可能的分数使用不同的递增值,将示例数据转换为 (20, 0)、(15, 0)、(14, 0)、(14, 1)、(13, 0)?
  • 您可以使用 >32 位值吗?

如果其中任何一个的答案是好的,那么也许这是可能的。如果答案都不好,那么根本不可能做你想做的事。

[编辑:考虑到下面的评论,您的新问题的答案是:

double value = (double) score - ((double)timestamp) / (((long long)1) << 33);

容易多了。一直到公元 2242 年都很好。

假设您的实现中的 double 是 64 位,这几乎是通用的。]

关于c - 用单个数值表示前 10 名列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4476062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com