跳跃表(Skip List)

本文介绍了一种基于链表的数据结构——跳跃表,通过增加额外的前向链接以提高查找效率,达到平均O(logn)的时间复杂度。文章详细解释了跳跃表的工作原理及其在并发环境下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


跳跃表(Skip List),它是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。
基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表,因此得名。所有操作都以对数随机化的时间进行。
。他是一种多路查找的有序链表。所以他有几个特点:

1,顺序的链表

2,期望时间复杂度均为O(logn)

3,并发性能甚至好于红黑树,因为跳跃表在并发操作的时候只需要对局部加锁,而红黑树的平衡等操作本身就多耗费一些时间,在并发的情况下枷锁的范围还比较大(这个问题后续再研究)


跳跃表思想比较简单,下图(从别处找的)基本上就能说明跳跃表了。



跳跃表的查找和删除都比较的简单。还是说一下插入操作,插入除了要插入到最低层链表中,还要确定该元素是否要出现在其他的高层,决定插入元素是否同时插入到上一层主要是根据50%的随机概率事件。当然用软件实现完成还不可能吧,下面的代码是参照jdk当中的ConcurrentSkipListMap的随机算法。


/**

伪随机算法(xorshift RNG)但是可以满足需求,其主要采用异或和移位来实现

参考文献http://www.jstatsoft.org/v08/i14/paper

     */
    private int randomLevel() {
        int x = randomSeed;
        x ^= x << 13;
        x ^= x >>> 17;
        randomSeed = x ^= x << 5;
        if ((x & 0x8001) != 0) // test highest and lowest bits
            return 0;
        int level = 1;
        while (((x >>>= 1) & 1) != 0) ++level;
        return level;

    }


详情可参照原著 A Skip List Cookbook

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6776&rep=rep1&type=pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值