跳跃表
首先传统的用链表存储k-v结构的结点,并按照结点有序,那么插入查询删除的时间复杂度都是O(n),如果使用红黑树来存储插入查询删除的时间复杂度都是O(logn),但是一方面红黑树的实现比较复杂,并且每一个节点的插入和删除会操作很多结点,这样不适合多线程操作,这时候跳跃表实现了存储插入查询删除的时间复杂度接近O(logn),且操作结点的数量很少,在数据量非常大的情况下,存储结构类似于二叉树。
首先一个结点类型是一个键值和一个结点指针的链表,这个链表的大小就是这个结点的层数。
1.跳表初始化:最大层数为0,大小为0,头结点代表的是全局最小。头结点的大小一直和最大层数相同。
2.查找:从头结点的最大层数开始依次查找此层的下一个结点的key值,如果相等就找到了,如果小于下一个结点的键值就往下层找,反之就往后查找,最后找到第0层后没有找到就代表没有。明显查找的时间复杂度是O(logn)
3.添加:先去查找跳表中的是否存在此结点key值,如果存在就直接修改就行。如果没有找到,那么key值的层数是随机的。在0-1的范围内取随机值,如果roll出0就让层数+1并继续循环,否则就停止。如果最后得出的这个结点的层数大于最大层数,就更新最大层数,并且在头结点的链表中添加相差的结点数量,每个节点都指向空。每次添加每一个key值所在的节点的每一层都会从头结点的最大层数开始找,如果此结点的下一个结点的值大于要添加的结点的值,那么就往下找,不然就遍历到这个结点链表的后一个结点,一旦碰到null就说明是全局最大值。直到找到对应层数的大于它键值的结点前插入然后往下遍历找这个结点下一层的插入位置,所以添加结点中每一层都有后继节点。
4.删除:同样也是先查找有没有这个结点,如果有的话就是从头结点开始找到当前结点最高层的结点位置,删除并向下找到下一层的结点位置,最后到达第0层全部释放所有节点后删除自己。

浙公网安备 33010602011771号