跳跃表-skiplist

前序

现在有一组数据,


然后要从这组数组中找到某个数,比如要查找数7,一般来说,逐个逐个来查找的话,那么时间复杂度就是O(n),


当n的数量达到上百万,或上千万时,那性能是非常差的,在我们系统中是不能接受的。

也许我们想到了hash,平衡二叉树结构来提高性能,今天我们来讲另一个结构:跳跃表-skiplist。

比如二叉树,它会提取一些节点作为树的根节点,当然这里树指整棵树也指树的子树,类似地,我们跳跃表也可以提取出一些关键节点出来,

像上图,我们提取1,5,11节点出来,则这里跳跃表的最大层次高度为2。

再用上面的例子,那我们查找7的话,如何查找?

查找

我们从最大高度的开始找起,首先从1节点开始,7比1大,则找1的下一个节点,从1节点的最高高度找到它的下一个节点节点5(如果7比最高高度的下一节点数少,则从1节点的最高高度往下降一高度的下一节点比较),7比5大,则在当前高度,打5的下一节点11,7比11小,则5的高度降小一级,找5的0高度的下一节点9,7比9小,则结束了,没有找到。

路径为:(1)->(5)->(9)

跳跃表通过关键节点的比较,和跳跃表高度的下一节点比较,时间复杂度为O(log2(n)。空间复杂度为O(2n)。

添加

现我们需要添加元素时,比如添加12,17:

添加到跳跃表后,


新的元素添加到跳跃表后,是否需要提取出新的关键节点,通过抛硬币,正面则提取关键节点,是否提取关键节点,可参照的说明Skip_list

再提取

删除

删除节点则移除相关节点,相关的下一节点也移除,添加和删除节点,跳跃表维护比较简单,不像红黑树需要重新维护红黑树平衡,左旋,右旋,变色等等操作。

skip list:

https://en.wikipedia.org/wiki/Skip_list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值