跳表——Skip List

Posted by 皮皮潘 on 12-02,2021

跳表对标的是平衡树,是一种插入、删除、搜索都是O(logn)的数据结构,由于其原理简单、容易实现因此在非常多的项目中,如:redis、levelDB都是用跳表来替代平衡树

跳表处理的都是有序的链表,它在有序链表的基础上,给每个节点加上了层级的概念,比如3层的节点除了指向下一个1层的节点之后还会指向下一个2层的节点以及下一个3层的节点

在进行节点搜索时,从最高层的节点开始搜索,这样每次搜索一个高层的节点都会跳过多个低层的节点,如下图所示在一个二层的跳表里搜索数字19,其路径为6 -> 9 -> 17 -> 19:

Image.png

通过对于二层节点的搜索跳过了1层节点的搜索从而使得原来为O(n)的时间复杂度变为了O(n / 2),同理随着层数的增高时间复杂度会进一步降低

在进行节点插入时,节点的层数通过抛硬币的方式随机生成,如果是正面(random < 0.5)则层数加一,直到抛出反面(random > 0.5)或者等于最高高度(log n)为止,其中不同层的节点之间关联的建立可以在搜索插入位置时将需要建立关联的节点记录下来

同理,在进行节点删除时把节点和对应的所有关联全部删除,并重新建立多级节点之间的关联即可

相较于平衡树,跳表会占据更多的空间,因为它使用了更多的空间去存储每个节点的关联指针