skiplist 分析

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

跳表查找一个元素的过程很像“一日千里”,每次可能跳过很多个元素而非一个元素。时间复杂度为 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 位置。

skiplist 分析_第2张图片

现在反着看遍历的路径,从 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 分析_第3张图片

skiplist 分析_第4张图片

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





你可能感兴趣的:(算法,数学)