Data structures 我应该选择哪种数据结构?

Data structures 我应该选择哪种数据结构?,data-structures,Data Structures,我想列出一场比赛的最高分。超过300000名球员将按他们的最高得分顺序被列入名单。玩家可以通过输入自己的名字和新的最高分数来更新自己的高分。一次只显示10个分数,用户可以键入他们想从哪个地方开始。因此,如果他们输入“100100”,那么整个列表将刷新,并显示第100100个分数到第100109个分数。那么在这种情况下我应该使用什么样的数据结构呢?我正在考虑使用哈希表,将用户名作为键,更新他们的分数需要不断的时间。但如果一个用户以前的分数是100分,并且在他更新了分数后,他的分数成为了整个列表中的

我想列出一场比赛的最高分。超过300000名球员将按他们的最高得分顺序被列入名单。玩家可以通过输入自己的名字和新的最高分数来更新自己的高分。一次只显示10个分数,用户可以键入他们想从哪个地方开始。因此,如果他们输入“100100”,那么整个列表将刷新,并显示第100100个分数到第100109个分数。那么在这种情况下我应该使用什么样的数据结构呢?我正在考虑使用哈希表,将用户名作为键,更新他们的分数需要不断的时间。但如果一个用户以前的分数是100分,并且在他更新了分数后,他的分数成为了整个列表中的最高分数,那该怎么办呢?然后,如果使用哈希表,则需要线性时间,因为我需要比较列表中的每个分数,以确保是最高的。因此,除了使用哈希表之外,还有更好的数据结构可供选择吗?

使用基于映射(有序树)的容器,其中包含分数键和包含名称键的哈希。让这些值作为指向存储在列表或数组等中的实体的链接。也就是说,按照您的喜好存储数据,以便快速执行不同的访问。

您应该选择针对最常见的操作进行优化的数据结构。根据您对有序列表的描述,最常见的操作可能是查看列表(并在其中跳跃)

如果使用以用户名为键的哈希表,则按分数顺序显示列表将非常昂贵,而当查看者在列表中跳转时,计算不同的视图将非常昂贵


相反,使用按分数排序的简单列表将使所有“查看”操作非常便宜,并且非常容易实现。当用户更新他们的分数时,只需按姓名对用户进行线性(
O(n)
)搜索并删除他们的旧条目。然后,由于列表已排序,您可以在
O(log n)
time中搜索它,找到在列表中重新插入新条目的位置。

谢谢您的建议。你的
O(logn)
时间是否意味着如果新分数小于以前的分数,则向前搜索。如果较大,则向后搜索。就像平衡二叉搜索树进行“分割搜索”一样,这也需要
O(logn)
?当您更新分数时,您还可以使用旧分数来实现删除的
O(logn)
性能。这可能会找到一个范围,但您可以在该范围内扫描所需的用户。