咨询关于快速排序取排名的问题

yangyunzhao 2015-06-24 01:09:33
最近做游戏服服务端,新增一个排名的需求,需要显示经验值前100名玩家,同时也需要显示自己的排名。

我分析了一下,其实是三个问题:
1、排序:服务启动的时候,从mysql读入到内存,如何根据经验值快速排序。玩家规模在10万到100万之间。经验值是一个uint32类型数据。

2、插入:在经验值改变后,如果更新这个排序。

3、查找:根据玩家的经验值,找到自己的排名。

这三个问题,如果不考虑效率问题,我自己可以解决。
这里想请教一下,有没有最优或者近似最优的算法,用于解决我的问题,谢谢!!
...全文
241 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
瑞卡哥哥 2015-07-13
  • 打赏
  • 举报
回复
top 100 用堆排序 选取最大的100 如果一直在内存中保存的数据 可以使用 红黑树来保存你的 经验值数据. 增删改 都比较方便.
Tiger_Zhao 2015-07-13
  • 打赏
  • 举报
回复
参考数据库页的结构,简化成2级:
数据页:记录字段(id,经验值,页内排名);页内所处的位置(下标)本来是页内排名,考虑相同排名的可能、专门记录;大概1000条一页。
索引页:记录字段(数据页号,最小经验值,最大经验值,最小总排名);差不多也是1000条。

更新
一般更新经验值后,只需要在数据页内调整次序;
必要时(比较最大/最小经验值)和前一页最大/下一页最小的记录交换,然后在新页中调整次序;

查找
先在索引页中按最大/最小经验值查找,然后到数据页中二分查找,总排名=最小总排名+页内排名。

32,945

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧