排行榜功能

news/2025/2/5 8:11:27/

游戏中的排行榜功能太常见了。各种战力排行榜,积分排行榜,连抢红包都有排行榜。

时间复杂度分析

后端程序实现的时候,第一个想到的肯定是排序算法,把要进行排行的数据收集起来,使用排序算法排好序,第一个元素排名为1,依次类推。我们知道,排序算法,使用快排的平均时间复杂度为O(nlogn), 获取玩家的排名,需要遍历计算排名,时间复杂度为O(n)。 那么更新玩家积分并获取玩家最新排名,这个操作的时间复杂度为 O(nlogn) + O(n), 对于少量玩家排行榜系统来说,是可以接受的。但是对于100万,甚至1000万玩家的排行榜系统来说,每次更新都要重新排序,显然不可接受,我们需要更快的算法。
更快的算法,基本思路就是空间换时间,摒除每次都将所有数据重新排序的思路,改为部分数据调整,Redis的Sorted Set数据结构使用了 跳表哈希表 结合的方式,更新数据的时间复杂度为 O(logn), 获取排行的时间复杂度为 O(logn), 即使数据量很大,也能高效排序。

示例代码

-- 更新充值排行 score为double类型
local function update(pid, score)redis:zadd("charge_rank", score, pid)return redis:zrevrank("charge_rank", pid) + 1
end

如果服务器框架没有使用Redis, 也可以参考Redis手动实现一个 Sorted Set在服务器内部使用。

细节补充

  • 如果用于排序的值,多个玩家相同,如何处理?
    redis在score相同时,默认按member的字母表顺序排序。

While the same element can’t be repeated in a sorted set since every element is unique, it is possible to add multiple different elements having the same score. When multiple elements have the same score, they are ordered lexicographically (they are still ordered by score as a first key, however, locally, all the elements with the same score are relatively ordered lexicographically).
The lexicographic ordering used is binary, it compares strings as array of bytes.

所以我们要根据策划的需求来调整代码,看策划是否需要对相同排序值,显示相同排名?或者按先来后到的方式?

被忽略的排行:登录排队

登录排队,也是一个排行榜,和普通的排行榜不一样的是,登录排队一般严格按照先来后到的方式排序,最适合的score参数是时间戳。
登录排队,score参数一样的情况下如何处理?我们先来看看参数一样,会造成什么结果。玩家B先进入排队,时间戳为100,显示当前排位为第5位,玩家A后进入排队,时间戳也为100,因为玩家A按字母表顺序排在玩家B前面,显示当前排位为第5位。排队等待期间,玩家B的排位更新了,显示当前排位为第6位!被插队了!玩家B表示很生气!不能忍!怒删游戏!此时可以采取score值相同,显示相同排名的方法。更佳的做法是延后1~3秒更新当前玩家的排名,这样就不会出现看起来被插队的情况了(实际上还是插队了)。

结语

与人斗,其乐无穷,排行榜,这个功能,可以说是荣誉榜,也可以说是竞争榜,还可以是名利榜,游戏中有江湖,排行榜就是江湖之始。


http://www.ppmy.cn/news/283904.html

相关文章

Tomcat 部署

一.Tomcat介绍 Servlet 是 Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法&#xff0…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.10-06.16 #12场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-06-10(周六) #4场比赛2023-06-11…

关于对【oracle索引】的理解与简述

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131094864 出自【进步*于辰的博客】 无论使用的是oracle、mysql,亦或者其他数据库&a…

【算法】【差分数组】解决连续空间改变相同值的问题

介绍 1. 什么是差分数组 将原数组每个值减去前一个值,得到的新数组是差分数组 d i s [ k ] a [ k ] − a [ k − 1 ] dis[k] a[k] - a[k-1] dis[k]a[k]−a[k−1] 如: 原数组为 [ 1 , 2 , 3 , 5 ] [1,2,3,5] [1,2,3,5] 得到的差分数组为 [ 1 , 1 , …

vim编辑器基本使用

一、写在前面 今天在练习git相关操作时,无意间发现当你使用commit命令提交代码时,忘记添加备注信息会自动进入一个奇怪的模式,按esc键亦或是ctrlC都无法退出,这个奇怪的模式也就是vim编辑器。如下图: vim是一种文本…

联想企业科技集团发布系列白皮书,“新IT”为高质量发展注入“新动能”

我们应该如何理解当下中国的数字化转型?这是个值得讨论的问题。 《“十四五”国家信息化规划》总结的“十三五”期间获得成绩显示,中国电子信息制造业增加值保持年增长9%以上,软件业务收入保持年增长13%以上。数字化转型的成果还可以被看得见…

用11本白皮书搭建3座桥:联想企业科技集团让智能化转型不再有孤岛

智能化转型是中国千万企业的时代必答题,也是全球第四次工业革命的契机与发端。若干年来,我们见证过各种各样的智能化解决方案与行业发展思路。但在各行业的智能化实践中,才会发现智能化转型是一件说起来很美好,做起来很艰难的工作…

申请Let‘s Encrypt免费SSL证书、自动化续签证书

一、环境 安装证书的环境为Centos Nginx,如果没有安装Nginx则需要先安装。 二、申请流程 1、开放80和443端口 firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port443/tcp firewall-cmd --reload2、安装 certbot 使用certbot工具能…