实现一个基于哈希的分布式实时游戏排行榜系统(支持分数更新和Top K查询)
字数 560 2025-12-03 00:53:39

实现一个基于哈希的分布式实时游戏排行榜系统(支持分数更新和Top K查询)

题目描述:设计一个分布式实时游戏排行榜系统,支持以下操作:

  1. 添加或更新玩家分数(addScore(playerId, score))
  2. 查询前K名最高分玩家(topK(k))
  3. 查询某个玩家的排名和分数(getPlayerInfo(playerId))

系统需要处理高并发更新和查询,并保证数据一致性。

解题过程:

步骤1:设计数据结构
我们需要两个核心数据结构:

  • 哈希表(playerMap):存储玩家ID到分数的映射,实现O(1)的分数更新
  • 有序结构(rankTree):用于维护分数排名,支持Top K查询

具体实现:

class DistributedLeaderboard:
    def __init__(self):
        self.player_map = {}  # {player_id: score}
        self.rank_tree = SortedDict()  # {score: set(player_ids)}

步骤2:分数更新操作

def addScore(self, playerId: int, score: int) -> None:
    if playerId in self.player_map:
        # 移除旧分数
        old_score = self.player_map[playerId]
        self.rank_tree[old_score].remove(playerId)
        if not self.rank_tree[old_score]:
            del self.rank_tree[old_score]
        
        # 更新分数
        new_score = old_score + score
    else:
        new_score = score
    
    # 更新哈希表
    self.player_map[playerId] = new_score
    
    # 更新有序结构
    if new_score not in self.rank_tree:
        self.rank_tree[new_score] = set()
    self.rank_tree[new_score].add(playerId)

步骤3:Top K查询实现

def topK(self, k: int) -> List[int]:
    result = []
    # 从高分到低分遍历
    for score, players in reversed(self.rank_tree.items()):
        for player in players:
            result.append(player)
            if len(result) == k:
                return result
    return result

步骤4:玩家信息查询

def getPlayerInfo(self, playerId: int) -> Tuple[int, int]:
    if playerId not in self.player_map:
        return (-1, -1)  # 玩家不存在
    
    score = self.player_map[playerId]
    rank = 1
    
    # 计算排名:统计所有更高分数的玩家数量
    for s in self.rank_tree:
        if s > score:
            rank += len(self.rank_tree[s])
    
    return (rank, score)

步骤5:分布式扩展考虑
在实际分布式环境中,我们需要:

  1. 数据分片:按玩家ID哈希分片到不同节点
  2. 一致性保证:使用分布式锁或版本控制
  3. 排名计算:使用全局聚合或近似排名算法

优化方案:

  • 使用跳表(Skip List)替代平衡树,提高并发性能
  • 实现分数压缩,减少内存占用
  • 添加缓存层,缓存Top K结果

这个设计确保了:

  • 分数更新:O(log n) 时间复杂度
  • Top K查询:O(k) 时间复杂度
  • 玩家查询:O(log n) 时间复杂度
  • 支持高并发操作
实现一个基于哈希的分布式实时游戏排行榜系统(支持分数更新和Top K查询) 题目描述:设计一个分布式实时游戏排行榜系统,支持以下操作: 添加或更新玩家分数(addScore(playerId, score)) 查询前K名最高分玩家(topK(k)) 查询某个玩家的排名和分数(getPlayerInfo(playerId)) 系统需要处理高并发更新和查询,并保证数据一致性。 解题过程: 步骤1:设计数据结构 我们需要两个核心数据结构: 哈希表(playerMap):存储玩家ID到分数的映射,实现O(1)的分数更新 有序结构(rankTree):用于维护分数排名,支持Top K查询 具体实现: 步骤2:分数更新操作 步骤3:Top K查询实现 步骤4:玩家信息查询 步骤5:分布式扩展考虑 在实际分布式环境中,我们需要: 数据分片:按玩家ID哈希分片到不同节点 一致性保证:使用分布式锁或版本控制 排名计算:使用全局聚合或近似排名算法 优化方案: 使用跳表(Skip List)替代平衡树,提高并发性能 实现分数压缩,减少内存占用 添加缓存层,缓存Top K结果 这个设计确保了: 分数更新:O(log n) 时间复杂度 Top K查询:O(k) 时间复杂度 玩家查询:O(log n) 时间复杂度 支持高并发操作