skiplist 分析

SkipList 即跳表,用于快速定位某个元素。下面这张图片非常好的表示了从链表变迁到跳表的过程。

跳表查找一个元素的过程很像“一日千里”,每次可能跳过很多个元素而非一个元素。时间复杂度为 lgn.下面解释为什么时间复杂度为 lgn。

设第 i 层的元素出现在第 i+1 层的概率为 p,第 i 层即第 i 根链表,从下往上递增。如,第 1 层包含所有的 n 个元素 ,第 2 层期望有 pn 个元素,第 3 层期望有 p^2*n 个元素。。。以这种衰减模式,直到 log(1/p)n 层衰减为零。因此,skiplist 的期望高度是  log(1/p)n 。为了得出时间复杂度,需要计算在查找元素的路径中,在每一层上面的访问次数。

考虑在跳表中找到一个元素( 6 )的路径的反向路径。如图所示:

路径停止于 A,表示在此处找到了元素 6.称A所在那一列为 R 列,R左边紧挨那一列为 L 列。则 L 列不可能比 R 列更短:因为 skiplist 中寻找元素的路径总是往右下方进行的,若 L 比 R 更短,则不可能寻找到 R 的 A 位置。


现在反着看遍历的路径,从 A 到 B 的概率是 1-p,(即在 B 点存在的情况下,没有更高层的概率,此条件概率为 1-p,参考另一篇文章),此即是几何分布,求得关于随机变量“在同一层上访问的节点个数”的期望值即是 1/p。

而 skiplist 共有 log(1/p)n 层,故所有层链表需要访问的节点数目为 log(1/p)n * 1/p 再加上 log(1/p)n,后面一项是向下访问节点的总数。一般而言, p 是个小于 1 的常数,令 x = 1/p.

则时间复杂度函数 f(x)=logxn*(1+x),下面对此函数求导,如图所示



以上从数学的角度理论分析了 skiplist 的时间复杂度,当 p 为常数时,时间复杂度为 lgn ,且当 p 靠近于 0.278 时,时间复杂度相对最低。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值