【问题标题】:Which Data Structure should I choose?我应该选择哪种数据结构?
【发布时间】:2013-11-12 03:44:41
【问题描述】:

我正在考虑列出游戏的最高得分。超过 300,000 名玩家将按最高分排名。玩家可以通过输入他们的名字和新的最高分来更新他们的高分。一次只显示 10 个分数,用户可以输入他们想要从哪个位置开始。因此,如果他们输入“100100”,那么整个列表应该刷新,并显示第 100,100 分到第 100,109 分。那么在这种情况下我应该使用什么数据结构呢?我正在考虑使用 hashTable 和用户名作为键,更新他们的分数需要恒定的时间。但是如果一个用户之前的分数是第 100,100 位,并且在他更新他的分数之后,他的分数成为了整个列表中的最高分呢?然后,如果使用哈希表,则需要 线性时间,因为我需要比较列表中的每个分数以确保是最高的。那么,除了hashTable,还有没有更好的数据结构可供选择?

【问题讨论】:

    标签: data-structures


    【解决方案1】:

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

    如果您使用以用户名作为键的哈希表,那么显示按分数排序的列表将非常昂贵,并且当查看者在列表中四处跳动时计算不同的视图非常昂贵。

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

    【讨论】:

    • 感谢您的好建议。您的O(logn) 时间也是如此,如果新分数小于以前的分数,则向前搜索。如果更大,则向后搜索。就像平衡二叉搜索树一样进行“拆分搜索”,也需要O(logn) ?
    • 更新分数时,也可以使用旧分数达到O(log n)的性能进行移除。这可能会找到一个范围,但您可以在其中扫描所需的用户。
    【解决方案2】:

    使用带有分数键的基于地图(有序树)的容器和带有名称键的散列。让这些值成为存储在列表或数组等中的实体的链接。即,根据需要存储数据,为您需要快速执行的不同访问设置索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2012-05-15
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多