Algorithm 基于分数对用户进行排名的数据结构建议

Algorithm 基于分数对用户进行排名的数据结构建议,algorithm,data-structures,ranking,Algorithm,Data Structures,Ranking,我希望使用创建和维护内存中的列组 基于分数计算与用户ID和等级关联的分数。应支持以下功能 根据分数升序或降序对等级进行排序。在O(对数n)时间内插入或删除 给定一个用户id,在O(logn)时间内查找用户的排名/分数以及n个前后排名。例如,获取用户8347的等级,包括前5级和后5级 从任意偏移量x检索n个列组。例如,从800开始获得100个等级 考虑到这些要求,有没有关于哪种数据结构最适合这些要求的建议?我认为,结合使用顺序统计树和哈希表可以非常有效地实现这一点 顺序统计树是一种扩充的二叉搜

我希望使用创建和维护内存中的列组

基于分数计算与用户ID和等级关联的分数。应支持以下功能

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

考虑到这些要求,有没有关于哪种数据结构最适合这些要求的建议?

我认为,结合使用顺序统计树和哈希表可以非常有效地实现这一点

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

为了将用户与其分数相关联,可以将此结构与从用户ID到订单统计树中保存该用户分数的节点的辅助哈希表映射相结合。这将给你O(1)访问一个球员的分数,除了O(lgn)查找分数的排名


希望这有帮助

使用内存中的SQLite数据库。

优先级队列如何


每个人都有一个分数,将其放入优先级队列,然后它将按照升序/降序优先级/值/等级等进行排序。

二叉搜索树,一个实现-


谢谢你的建议。我倾向于使用红黑树,它保存子级的数量(因此排名),但RB树的插入和删除(特别是在旋转时)似乎存在一些并发问题。我不明白有没有办法使用顺序统计树更新用户的排名?
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)