美文网首页
SkipList(跳跃表)

SkipList(跳跃表)

作者: 池塘游泳的蜗牛 | 来源:发表于2018-12-30 20:59 被阅读0次

简介

  跳跃表是一种单链表形式的链式结构,不同于一般的链式结构其为多层链式结构。正因为这种多层结构从而相比于单式结构的搜索性能得到了大幅提高。其搜索方式有点类似于二叉搜索所以理论搜索性能达到了 O(logn)。

一、理论证明

性能分析请戳这里

二、实现方式

  如上图所示跳跃表一般有一个哨兵节点。该哨兵节点不是一个单节点,而是一组节点。节点的数目与跳跃表的层高保持一致。当插入一个节点时我们需要进行如下几步操作:

1, 寻找插入位置
2, 随机生成层高
3, 插入节点

1,插入

  如上示例,在层高为6的跳跃表中插入元素3。我们从哨兵节点组的最高层寻找插入点。5,6两层的第一个节点值为4大于3,降低层高到第四层发现第一个元素为2小于3,所以将该元素插入节点2之后。

 Node add(int i, Node w) {
        Node u = sentinel;
        int k = w.height();
        int r = h;
        int j = -1; // index of u
        while (r >= 0) {
            while (u.next[r] != null && j+u.length[r] < i) {
                j += u.length[r];
                u = u.next[r];
            }
            u.length[r]++;    // to account for new node in list 0
            if (r <= k) {
                w.next[r] = u.next[r];
                u.next[r] = w;
                w.length[r] = u.length[r] - (i - j);
                u.length[r] = i - j;
            }
            r--;
        }
      
        return u;
    }
2,查询

  查询与上述插入类似。从最高层开始寻找。如果搜索元素大于需要寻找的KEY,降低层高直到搜索到的元素不小于时退出。这时找到的元素为大于等于该KEY的值。再次比较下就OK了。

Node<T> findPredNode(T x) {
        Node<T> u = sentinel;
        int r = h;
        while (r >= 0) {
            while (u.next[r] != null && compare(u.next[r].x,x) < 0)
                u = u.next[r];   // go right in list r
            r--;               // go down into list r-1
        }
        return u;
    }
3,删除

  删除的前提是查询,只有查到元素的具体位置才能删除;


 boolean remove(T x) {
        boolean removed = false;
        Node<T> u = sentinel;
        int r = h;
        int comp = 0;
        while (r >= 0) {
            while (u.next[r] != null && (comp = compare(u.next[r].x, x)) < 0) {
                u = u.next[r];
            }
            if (u.next[r] != null && comp == 0) {
                removed = true;
                u.next[r] = u.next[r].next[r];
                if (u == sentinel && u.next[r] == null)
                    h--;         // skiplist height has gone down
            }
            r--;
        }
        return removed;
    }
三, SkipList VS Rb_Tree VS Hash

  首先HASH算法无疑是效率最高的,但是HASH存在致命缺陷冲突。红黑树理论效率与SkipList一致但实现复杂度方面要高好几个量级,并且红黑树是无序的也就是说不能进行批量查询,在这方面跳跃表就有很好的优势。当年然跳跃表也有其劣势那就是内存占用率,其每个节点都需要消耗额外的节点维护其所在层的后驱。

四,使用场景

跳跃表可以使用在对内存不是很敏感且需要支持批量查询的场景。现实场景中LevelDB,Redis 便使用其作为查询数据结构。

refer:http://opendatastructures.org/versions/edition-0.1e/ods-java/Contents.html

相关文章

  • 跳跃表(skiplist)

    鸣谢: https://blog.csdn.net/xiaolei1982/article/details/507...

  • SkipList(跳跃表)

    简介   跳跃表是一种单链表形式的链式结构,不同于一般的链式结构其为多层链式结构。正因为这种多层结构从而相比于单式...

  • skiplist 跳跃表分析

    跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(log...

  • 科普跳跃表-SkipList

    什么是跳表 跳表是一种有序的数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问的目的。 核心...

  • 跳跃表skiplist原理

    github地址:https://github.com/arkulo56/thought/blob/master/...

  • Redis 跳跃表(skiplist)

    Redis基础类型中的有序集合、集群节点的内部数据结构用到了跳跃表(skiplist)。 5.1 跳跃表的实现 图...

  • Redis(2)——跳跃表

    一、跳跃表简介 跳跃表(skiplist)是一种随机化的数据结构,由 William Pugh 在论文《Skip ...

  • python实现跳跃表(SkipList)

    跳跃表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AV...

  • Redis设计与实现4 有序集合对象(跳跃表)的介绍

    跳跃表  跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速...

  • Redis-数据结构-跳跃表

    跳跃表(skiplist) 跳跃表是一种有序数据结构,通过在每个节点中维护多个指向其他节点的指针,达到快速访问节点...

网友评论

      本文标题:SkipList(跳跃表)

      本文链接:https://www.haomeiwen.com/subject/lqtblqtx.html