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个指针,比平衡树更有优势。

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/10570246.html
Copyright © 2011-2022 走看看