Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
嵌入式技术综合讨论
关于skiplist的一篇文章,推荐一下
发布于 2017-06-27 17:09:04 浏览:2359
订阅该版
[https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650561181&idx=1&sn=ef1d79c99ffcb474daf603fb34c237b2&chksm=f1feec1ec6896508db49ccedcbd546f2ee4512fdb0fa7883bb0861f723cf7a096e866edab252&mpshare=1&scene=23&srcid=0626IuK3RqczAnGIRJEXHxsm#rd](https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650561181&idx=1&sn=ef1d79c99ffcb474daf603fb34c237b2&chksm=f1feec1ec6896508db49ccedcbd546f2ee4512fdb0fa7883bb0861f723cf7a096e866edab252&mpshare=1&scene=23&srcid=0626IuK3RqczAnGIRJEXHxsm#rd) ![QQ图片20170707114822.png](https://oss-club.rt-thread.org/uploads/4615_ceef9a6dd9e26c9bcd4364c6bb0cc12d.png) ![QQ图片20170707115054.png](https://oss-club.rt-thread.org/uploads/4615_694ff313f00027af7f5292feb9bac01c.png) ![QQ图片20170707140154.png](https://oss-club.rt-thread.org/uploads/4615_a04f72f54b51a87c3e5df1c174f7c2c2.png) ![QQ图片20170707140454.png](https://oss-club.rt-thread.org/uploads/4615_5d40167532840ec44ac42662d90e467b.png) ![QQ图片20170707140627.png](https://oss-club.rt-thread.org/uploads/4615_96b83258bad7e28c8f4e0241ce099eb5.png) ![QQ图片20170707140904.png](https://oss-club.rt-thread.org/uploads/4615_951a9fd77dedae52d99c59d91562e417.png) ![QQ图片20170707140941.png](https://oss-club.rt-thread.org/uploads/4615_1bd1a51cfdfcce2bab0b34d27d7b0360.png) ![QQ图片20170707141122.png](https://oss-club.rt-thread.org/uploads/4615_fdf46275f6b369680acd1384d04db0db.png)
查看更多
5
个回答
默认排序
按发布时间排序
geniusgogo
认证专家
2017-07-07
这家伙很懒,什么也没写!
原文链接来自:[http://kenby.iteye.com/blog/1187303](http://kenby.iteye.com/blog/1187303) **为什么选择跳表** 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,就能轻松实现一个 SkipList。 **有序表的搜索** 考虑一个有序表: [attach]2790[/attach] 从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数为 2 + 4 + 6 = 12 次。有没有优化的算法吗? 链表是有序的,但不能使用二分查找。类似二叉搜索树,我们把一些节点提取出来,作为索引。得到如下结构: [attach]2791[/attach] 这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。 我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构: [attach]2792[/attach] 这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。 **跳表** 下面的结构是就是跳表: 其中 -1 表示 INT_MIN, 链表的最小值,1 表示 INT_MAX,链表的最大值。 [attach]2793[/attach] 跳表具有如下性质: 由很多层结构组成 每一层都是一个有序的链表 最底层(Level 1)的链表包含所有元素 如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。 ** 跳表的搜索** [attach]2794[/attach] 例子:查找元素 117 [list=]比较 21, 比 21 大,往后面找 比较 37, 比 37大,比链表最大值小,从 37 的下面一层开始找 比较 71, 比 71 大,比链表最大值小,从 71 的下面一层开始找 比较 85, 比 85 大,从后面找 比较 117, 等于 117, 找到了节点。[/list] 具体的搜索算法如下: /* 如果存在 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(采用丢硬币的方式,这完全是随机的) 然后在 Level 1 ... Level K 各个层的链表都插入元素。 例子:插入 119, K = 2 [attach]2795[/attach] 如果 K 大于链表的层数,则要添加新的层。 例子:插入 119, K = 4 [attach]2796[/attach] **丢硬币决定 K** 插入元素的时候,元素所占有的层数完全是随机的,通过一下随机算法产生: ``` int random_level() { K = 1; while (random(0,1)) K++; return K; } ``` 相当与做一次丢硬币的实验,如果遇到正面,继续丢,遇到反面,则停止,用实验中丢硬币的次数 K 作为元素占有的层数。显然随机变量 K 满足参数为 p = 1/2 的几何分布,K 的期望值 E[K] = 1/p = 2. 就是说,各个元素的层数,期望值是 2 层。 **跳表的高度** n 个元素的跳表,每个元素插入的时候都要做一次实验,用来决定元素占据的层数 K,跳表的高度等于这 n 次实验中产生的最大 K,待续。。。 **跳表的空间复杂度分析** 根据上面的分析,每个元素的期望高度为 2, 一个大小为 n 的跳表,其节点数目的期望值是 2n。 **跳表的删除** 在各个层中找到包含 x 的节点,使用标准的 delete from list 方法删除该节点。 例子:删除 71 [attach]2797[/attach]
aozima
2017-06-27
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
楼主可以搬运全文不? 不然过几天链接就可能失效了。
aozima
2017-07-07
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
顶楼上,图文并茂 [s:193]
bernard
2017-07-07
这家伙很懒,什么也没写!
为牛头点赞
撰写答案
登录
注册新账号
关注者
1
被浏览
2.4k
关于作者
geniusgogo
这家伙很懒,什么也没写!
提问
42
回答
157
被采纳
7
关注TA
发私信
相关问题
1
开新板块了! 迅速占领第一帖!
2
有想玩点阵做电子钟的没?手上有屏
3
LED点阵屏硬件保护研究笔记
4
USB相关、Android、Arduino
5
Arduino即将发布ARM平台新产品
6
关于开关电源的同步整流技术
7
rt_thread_wizard使用教程
8
[转]开源如何盈利
9
FM3系列MCU的IO操作笔记。
10
转一个xoolhaha 的寻一起开发的帖子
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
rt-thread使用cherryusb实现虚拟串口
2
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
3
《原子操作:程序世界里的“最小魔法单位”解析》
4
《C++设计模式:重塑游戏角色系统类结构的秘籍》
5
rt-thread官方usb驱动之虚拟串口
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
6
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部