【问题标题】:Suggestion for a data structure for ranking users based on scores对基于分数对用户进行排名的数据结构的建议
【发布时间】:2011-03-24 04:40:27
【问题描述】:

我正在寻找使用创建和维护内存中的排名。

与用户 ID 和排名相关的分数是根据分数计算的。应支持以下功能。

  • 根据分数升序或降序对排名进行排序。在 O (log n) 时间内插入或删除。
  • 给定一个用户 ID,在 O(log n) 时间内查找用户的排名/分数以及 n 个之前和之后的排名。例如。获取用户 8347 的排名,前后有 5 个排名。
  • 从任何偏移量 x 检索 n 个等级。例如。从 800 开始获得 100 个等级

鉴于这些要求,对于哪种数据结构最适合这些要求,有什么建议吗?

【问题讨论】:

    标签: algorithm data-structures ranking


    【解决方案1】:

    我认为您可以使用订单统计树和哈希表的组合非常有效地做到这一点。

    顺序统计树是一种增强的二叉搜索树,除了按排序顺序存储元素外,还允许通过元素在树中的索引来查找元素。也就是说,该结构支持 O(lg n) 插入、删除和通过键查找值,以及 O(lg n) 查找给定索引的元素。如果将分数存储在此结构中,则可以轻松插入或更新新分数,并跟踪树中每个元素的排名。

    为了将用户与其分数相关联,您可以将此结构与从用户 ID 映射到保存该用户分数的订单统计树中的节点的辅助哈希表相结合。除了 O(lg n) 查找得分排名之外,这将使您可以 O(1) 访问玩家的得分。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的建议。我倾向于使用红黑树,它保存子节点的数量(以及排名),但 RB 树的插入和删除似乎存在一些并发问题(尤其是在旋转时)。
    • 我没明白有没有办法使用订单统计树来更新用户的排名?
    【解决方案2】:

    使用内存中的 SQLite 数据库。

    【讨论】:

      【解决方案3】:

      优先队列怎么样?

      每个人都会有一个分数,把它扔到优先级队列中,它会做升序/降序优先级/值/等级/等排序的工作。

      【讨论】:

        【解决方案4】:

        二叉搜索树,一种实现 - http://en.wikipedia.org/wiki/AA_tree

        Space   O(n)            O(n)
        Search  O(log n)    O(log n)
        Insert  O(log n)    O(log n)
        Delete  O(log n)    O(log n)
        

        【讨论】:

          猜你喜欢
          • 2019-07-14
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          • 2017-10-01
          • 1970-01-01
          • 2021-11-02
          • 2023-03-03
          • 1970-01-01
          相关资源
          最近更新 更多