数据结构4--跳表


title: 数据结构-4-跳表
date: 2019-07-9
tags: [编程基础功,数据结构,转载]

跳表本质

跳表就是对排序完成的链表进行加工,间隔向上提取其中的元素成为索引,使得其查找的效率得到大大的提高。跳表的每一层就是一级索引。

[外链图片转存失败(img-6RlhIesO-1567648439359)(G:\666\blog\source_posts\img\1567431460390.png)]

跳表的复杂度

跳表的设计关键就是间隔几个元素向上抽取一个索引。如果每间隔一个元素就向上抽取,那么跳表使得单链表的查询复杂度由 O(n)提高到O(logn);类似于基于链表实现了二分查找(非常的相似)。

跳表对内存的浪费也是显而易见的。如果是每两个节点抽取一个索引,那么跳表的莪空间复杂度就是O(n)。其实多个节点抽取一个索引复杂度并没有变(只更改了系数而已)。

高效的动态插入和删除

插入操作也是先查询(如果是单链表还要查询两次呢)在做插入,所以有单链表的时间复杂度O(n)提高到O(logn)。删除操作同理。

但是如果在某两个索引节点之间插入的数据过多,会造成跳表的退化。

作为一种动态数据结构,我们需要某种手段来维护索引与原始链表大小之间的平衡,也就是说,如果链表中结点多了,索引结点就相应地增加一些,避免复杂度退化,以及查找、插入、删除操作性能下降。

随机函数

通过生成一个随机函数(随机函数应该是小于索引层数,索引层数越接近链表越小),就可以决定在把插入的数据插入到指定的索引层中去。

【注意】:

跳表实际上也是一种空间换时间。

Redis 的有序集合使用跳表实现的(使用分数排序),准确的说是: 由一个双 hashmap 构成的字典和跳跃表实现的。

准确的说是: 由一个双 hashmap 构成的字典和跳跃表实现的。

你可能感兴趣的:(数据结构)