zoukankan      html  css  js  c++  java
  • 关于数据结构跳表的一些介绍

    最初知道跳表是看到redis源码里用了跳表做实时排序,跳表的模型如下

    那么要实现一个玩家榜单实时排名,就是要对这个链表做实时维护,保证其有序性,如

    1、服务器启动从DB中加载N个上榜的玩家

    2、用跳表对其进行插入。插入完跳表是个有序的自然形成排行

    3、当有玩家数据变动

      1)如果排行榜已满,先判断Score是否比最后一名低,如果是直接抛弃

      2)如果自己在排行榜,是 ,如果在帮就把自己的SkipListNode删除,然后插入

      3)如果自己不在排行榜,则直接插入自己,删除最后一面,并向数据库发出存储指令(新增自己,删除最后一名,【如果自己和最后一名是一个人则什么也不做】)

    平衡二叉树也可以实现以上效果,那么为什么选择跳表呢?

    • 在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在skiplist上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以实现。

    • 平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。

    • 从内存占用上来说,skiplist比平衡树更灵活一些。一般来说,平衡树每个节点包含2个指针(分别指向左右子树),而skiplist每个节点包含的指针数目平均为1/(1-p),具体取决于参数p的大小。如果像Redis里的实现一样,取p=1/4,那么平均每个节点包含1.33个指针,比平衡树更有优势。

  • 相关阅读:
    Use MusicBrainz in iOS(三)查询专辑的完整信息
    内存寻址一(分段)
    POJ 1018 Communication System (动态规划)
    利用Eclipse中的Maven构建Web项目(二)
    cocos2d-x2.2.3学习
    (排序算法整理)NEFU 30/32
    POJ 1066 昂贵的聘礼
    2014年腾讯暑假实习软件开发笔试题汇总
    Android学习之——自己搭建Http框架(1)
    C 语言之预处理 ---------文件包括
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/10570246.html
Copyright © 2011-2022 走看看