发布网友 发布时间:2024-03-06 17:12
共3个回答
热心网友 时间:2024-03-15 04:18
居然有很多兄弟又是组件又是论文算法。一看就不是做游戏服务器的或者实用系统的。你们以为是多大一个事情呀?
全服排名?请问你的服是多少人?
1000人?随便你怎么排。冒泡算法都可以。
1000万人?只要你的数据不是太大,更新频道不是特别高,每次更新,或者定时更新的时候排序就可以了。红黑树大致也只用找20次。内存?64位的系统还要考虑内存。就算每个用户256字节。你算算才要多少数据?256*1000W=256*10M=2.5G。
但如果从架构上考虑,需要一台排序服务器来做这个事情。其实这也就是楼主的方法2而已。
1亿用户?其实前面已经证明了。上面的方法是可以搞的。内存25G就可以了。一台机器也就可以了。
10亿?全服能超过1亿用户的游戏,中国目前数估计不超过10个。CF,DNF,LOL这类还是分区游戏,不用考虑。主要是QQGAme的斗地主,天天飞车,天天酷跑,天天爱消除这类手游产品。当年如果你成了这种产品,成本看上去不再是问题了。
增加10台机器好像也不是太大问题,只是架构上。。。。。好像更麻烦了。
那么?
第一,你要那么及时吗?不要,直接上DB,一天导出一次就OK了。
第二,你要那么准确吗?忽悠用户是否可以?直接做一个很细致的分段出来就OK了。
还是一台服务器就搞掂了。
100亿?你不是在做游戏把。。
最后的最后,请问一下你的策划同学,当一个用户看到自己是第2000W名的时候,他对这个排名的感想?
什么年代了,还在用全区排序这种落后的设计。告诉你们的策划,我很BS他们。
热心网友 时间:2024-03-15 04:18
实际上游戏上的排行榜,比如战力,金币等,大家只关注最前面的N名,没有必要进行全服排序。没到这个范围的,可以提示比如”百名开外”这样的用词。
做了这个设计上的简化之后,这就是一个堆排序的top N的问题了。
至于其他人提到的可以做全局排序的方案,你权且看看当开阔眼界吧。做产品的时候,还是先找平衡的方式实现需求,而不是为了炫技。
离线排序,就是给你一个数组,你把它排好序,然后万事大吉。
这种排序直接std::sort,因此下面不谈。
在线排序,要求你维护一个有序序列。在任意时刻可以进行插入、删除、修改、查询排名操作。
提供两种思路。
一、平衡树
平衡树中,查询一个节点的排名是 的复杂度(对每个节点记下子树大小)
题目描述中的有序链表思路,我怀疑题主根本没有实现过。因为普通链表是不能二分的,需要使用“跳表”——平衡树的一种。
使用平衡树,上述四种操作均可以 完成。常数较大。
热心网友 时间:2024-03-15 04:18
如果一个人的分数为c。
插入:w[c]加1, .
删除:w[c]减1, .
修改分数为d:w[c]减1,w[d]加1, .
查询排名:输出w[c+1,MAX]的区间和, .
由于树状数组常数小,因此比平衡树稍快。
这个做法的特点是:无论有多少个人,我们都需要开MAX的空间,而且上面的(值域大小).
在人数很少或者值域很大的时候,这个算法是不优秀的——前者浪费时间,后者浪费空间。
但如果值域小(例如,所有人的分数都在100000以内),权值树状数组的优势会立刻体现出来:
即使有二十亿个人,上面的n仍然控制在10w,时间优势很大(平衡树的这个n会变成20亿);空间仍然只占用10w个int,不会由于人多而爆空间。
缺点是,值域不允许小数。(可以乘上10、100……来解决,然而这样值域也会暴涨)