关于数据结构跳表的一些介绍

最初知道跳表是看到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个指针,比平衡树更有优势。

猜你喜欢

转载自www.cnblogs.com/wangshaowei/p/10570246.html