跳跃表 SkipList【数据结构】原理及实现
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree,Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。 有序表的搜索考虑一个有序表: 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。 跳表下面的结构是就是跳表: 跳表具有如下性质: 跳表的搜索例子:查找元素 117 具体的搜索算法如下: /* 如果存在 x,返回 x 所在的节点, * 否则返回 x 的后继节点 */
find(x)
{
p = top;
while (1) {
while (p->next->key < x)
p = p->next;
if (p->down == NULL)
return p->next;
p = p->down;
}
}
跳表的插入先确定该元素要占据的层数 K(采用丢硬币的方式,这完全是随机的) 如果 K 大于链表的层数,则要添加新的层。 丢硬币决定 K int random_level()
{
K = 1;
while (random(0,1))
K++;
return K;
}
相当与做一次丢硬币的实验,如果遇到正面,继续丢,遇到反面,则停止, 跳表的高度。 跳表的空间复杂度分析 跳表的删除在各个层中找到包含 x 的节点,使用标准的 delete from list 方法删除该节点。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |