关于实时TopN排名算法的思考

  • 0.引言
  • 1.TopN实时排名算法
    • 1.1 一个失败的方案
    • 1.2 现成的数据结构?
    • 1.3 合理的方案
  • Reference

0.引言

实时排名是网络应用中常见的功能。根据需求不同,大概可以分为以下几类:

  • i. TopN排名
  • ii. 全数据排名

作为通用需求,我们必须做如下假设:

  • a. 用户基数较大
  • b. 排名数据更新较频繁
  • c. 用于排序的数据(score)范围不确定
  • d. 用作排名的score只会增加,不会减少

基于以上假设,全数据排名就是海量数据处理问题,一般认为内存难以胜任,一般通过数据库(如redis)实现,本文暂不讨论。

1.TopN实时排名算法

这里,我们假设:

  • N的范围有限(如1000),榜单数据内存完全可以处理

那么,问题来了。如何设计数据结构和算法,来满足大批量用户频繁更新榜单情况下的实时排名需求?

1.1 一个失败的方案

曾经看到一个实现,方案如下:

  • a. 定义一个长度为N+1的数组
  • b. 更新数据时,将新数据放到数组尾部
  • c. 对数组排序,如果数组长度为N+1,则移除尾部元素

咋一看,由于榜单数据较小,每次更新排序好像可行,但是随着用户基数和更新频度增加,
这个算法无疑跟DB设计把query建立在没有index的table上一样可怕。

随着更新频度提升,这个sort操作无疑将成为CPU的噩梦。

低效率的算法不会出bug,但是隐藏在角落偷偷的吃CPU,还很难被发现。

因此,该方案不可取

1.2 现成的数据结构?

经典的有序数据结构,如

  • 红黑树
  • Heap

貌似可以满足这种需求。

但是,我们知道,平衡二叉树的高效操作是在于快速查找,然而维护一棵树的平衡(插入,删除元素),却是成本很高的操作。

因此,不可取。

1.3 合理的方案

这个功能里有一个令人头疼的要求,就是客户端要实时能够查看到排名情况,那么问题来了:

  • 这里的实时是否意味着服务端数据必须实时有序?

答案是未必。我们知道,排序算法是计算机里面一个比较耗时的操作,频繁的排序更是无法忍受。

比较可行的方案是服务端不排序,只保证榜单记录TopN的数据,把实时排序的任务交给客户端执行。

  • 服务器如何保证榜单上只记录TopN的数据?

数据结构定义如下:

type RankInfo struct{name  string     // name of this rank elementscore int       // rank score
}
type RankList struct {list   []*RankInfo             // unordered top N rank listmin    *RankInfo             // the last one who own the minimum score in listnameMap map[string]*RankInfo // name->rankInfo
}

更新积分榜UdateRankList(name, score)的操作流程如下(假设score只会增加不会减少):

  • a. 从nameMap查找指定的name是否已在榜单上,如果存在,更新积分。如果该对象==min,则重新查找积分最低对象赋值给min,返回。
  • b. 如果list长度<N, 则直接将新数据插入list尾部,如果score<min.score,则将新对象赋值给min, 返回。
  • c. 如果score>min.score, 则顶替min对象数据,更新min.name,min.score为name,score,重新查找积分最低对象赋值给min, 返回。
  • d. 所给score不能上榜。

至此,排行榜更新完成。不需要排序,不需要支持排序的数据结构,高效的完成榜单维护,perfect。

Reference

  • 海量积分数据实时排名处理方式介绍
  • 实时排序算法(跳表)
  • Size Balanced Tree

关于实时TopN排名算法的思考相关推荐

  1. 热度TopN排名算法的设计

    热度TopN排名算法的设计 转载于 http://www.jianshu.com/p/44bee121463a 最近开始在简书上混,今日在首页上不经意间看到一篇<从豆瓣电影评分算法说起>, ...

  2. 实时排名算法简单分析

    需求分析 排名这个需求在比较多的项目中都有出现过,大家对此都不会感到太陌生,排名需要满足一下需求: 1查询用户所在的名次. 2查询前N名的用户. 3实时排名. 解决的办法有: 一数据库解决方案 单表操 ...

  3. 基于用户投票的排名算法(四):牛顿冷却定律

    作者: 阮一峰 日期: 2012年3月16日 这个系列的前三篇,介绍了Hacker News,Reddit和Stack Overflow的排名算法. 今天,讨论一个更一般的数学模型. 这个系列的每篇文 ...

  4. 实战 | flink sql 实时 TopN

    实战 | flink sql 实时 TopN 1.背景篇 2.难点剖析篇-此类指标建设.保障的难点 2.1.数据建设 2.2.数据保障 2.3.数据服务保障 3.数据建设篇-具体实现方案详述 3.1. ...

  5. 最新Google排名算法专利

    2006年8月22号,美国专利局刚刚批准了一份有关Google排名算法的专利,标题是"搜索结果排名中引入支持性编辑意见的系统和方法(System and method for support ...

  6. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条

    作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee 译者 | 刘畅 责编 | Jane 出品 | AI科技大本营(id:rgznai100) [导 ...

  7. 你知道“啥是佩奇”,却不一定了解佩奇排名算法

    作者 | 程序员小吴 从初学者的角度学习算法,以动画的形式呈现解题的思路. 来源 | 五分钟学算法 佩奇排名介绍 佩奇排名是根据页面之间的链接结构计算页面的值的一种算法.下面我们通过动画来理解进行计算 ...

  8. BP反向传播算法的思考和直观理解 -卷积小白的随机世界

    https://www.toutiao.com/a6690831921246634504/ 2019-05-14 18:47:24 本篇文章,本来计划再进一步完善对CNN卷积神经网络的理解,但在对卷积 ...

  9. 【图】2015年Google搜索引擎排名算法(完整版)

    2015年中旬,国外SEO网站发布了一份2015年Google搜索引擎排名算法的最新数据,从各个角度看待搜索引擎算法排名影响因素的变化.其组织每两年都会成立一个SEO专家调查小组,针对"Go ...

最新文章

  1. SD-WAN应用可见性的流量对称
  2. Python的魔法方法 .
  3. python把英语句子成分字母_句子成分的表达字母
  4. 279. 完全平方数 golang BFS
  5. python os.access_os.access(path, mode)
  6. DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
  7. java文件字节流和文件字符流的使用
  8. SQL Server高可用——日志传送(4-3)——使用
  9. 深搜和广搜--原理彼此的优缺点
  10. 高通WIFI模块QCA9377 调试
  11. 科研必备:LaTeX论文排版软件的简介,安装与使用教程
  12. win7 IIS安装与配置
  13. 多因子融合的实体识别与链指消歧
  14. python解超越方程_初试在Python中使用PARI/GP
  15. SAMSUNG,三星,N8000升级
  16. 股票数据接口-陈科肇
  17. maven~本地仓库的指定
  18. HTML页面设置ico图标
  19. 全面理解DAO-Web3.0基本组织形式
  20. 嵌入式开发 1 -8051单片机的结构体系(待更)

热门文章

  1. 电脑连接校园网,无法浏览网页
  2. “该内存不能为读写”的完全解决方案
  3. 一天下架近5万款APP!苹果“血洗”国区商店
  4. 由于找不到vcruntime140_1.dll,无法执行代码,重新安装程序可能会就解决此问题,解决方法
  5. Marriage is Stable 【HDU - 1522】【稳定婚姻匹配问题】
  6. 看游戏音乐行业如何走俏
  7. linux的vi编辑器课件,linux课件--第三章+文本编辑器vi.ppt
  8. <!DOCTYPE> 的作用
  9. 注册制可能对我们带来的影响-读《三十年股票投资心得》
  10. 互联网面试知识点总结(算法,后端)