已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
跳表(skiplist)的代码实现 跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN)。LevelDB的核心数据结构是用跳表实现的,redis的sorted set数据结构也是有跳表实现的。其结构如下所示:所有操作均从上向下逐层查找,越上层一次next操作跨度越大。其实现是典型的空间换时间。具体的细节,可参考维基百科/wiki/Skip_list本文作者将redis的sorted set代码进行整理,将跳表部分的实现抽取出来,供参考。skiplist.h 1 #ifndef _SKIPLIST_H 2 #define _SKIPLIST_H 3 4 #define SKIPLIST_MAXLEVEL 8 5 6 typedef struct skiplistNode 7 double score; 8 struct skiplistNode *backward; 9 struct skiplistLevel 10 struct skiplistNode *forward;11 level;12 skiplistNode;13 14 typedef struct skiplist 15 struct skiplistNode *header, *tail;16 unsigned long length;17 int level;18 skiplist;19 20 #endifskiplist.c 1 #include skiplist.h 2 #include 3 #include 4 5 skiplistNode *slCreateNode(int level, double score) 6 skiplistNode * sn = malloc(sizeof(*sn) + level*sizeof(struct skiplistLevel); 7 sn-score = score; 8 return sn; 9 10 11 skiplist *slCreate(void) 12 int j; 13 skiplist *sl; 14 15 sl = malloc(sizeof(*sl); 16 sl-level = 1; 17 sl-length = 0; 18 sl-header = slCreateNode(SKIPLIST_MAXLEVEL, 0); 19 for(j = 0; j header-levelj.forward = NULL; 21 22 sl-header-backward = NULL; 23 sl-tail = NULL; 24 return sl; 25 26 27 void slFreeNode(skiplistNode *sn) 28 free(sn); 29 30 31 void slFree(skiplist *sl) 32 skiplistNode *node = sl-header-level0.forward, *next; 33 34 free(sl-header); 35 while(node) 36 next = node-level0.forward; 37 slFreeNode(node); 38 node = next; 39 40 free(sl); 41 42 43 int slRandomLevel(void) 44 int level = 1; 45 while(rand()&0xFFFF) (0.5 * 0xFFFF) 46 level += 1; 47 return (level header; 55 int i, level; 56 for ( i = sl-level-1; i = 0; i-) 57 while(node-leveli.forward & node-leveli.forward-score leveli.forward; 59 60 updatei = node; 61 62 level = slRandomLevel(); 63 if (level sl-level) 64 for (i = sl-level; iheader; 66 67 sl-level = level; 68 69 node = slCreateNode(level, score); 70 for (i = 0; i leveli.forward = updatei-leveli.forward; 72 updatei-leveli.forward = node; 73 74 75 node-backward = (update0 = sl-header? NULL : update0); 76 if (node-level0.forward) 77 node-level0.forward-backward = node; 78 else 79 sl-tail = node; 80 sl-length+; 81 return node; 82 83 84 void slDeleteNode(skiplist *sl, skiplistNode *x, skiplistNode *update) 85 int i; 86 for (i = 0; i level; i+) 87 if (updatei-leveli.forward = x) 88 updatei-leveli.forward = x-leveli.forward; 89 90 91 if (x-level0.forward) 92 x-level0.forward-backward = x-backward; 93 else 94 sl-tail = x-backward; 95 96 while (sl-level 1 & sl-header-levelsl-level-1.forward = NULL) 97 sl-level-; 98 sl-length-; 99 100 101 int slDelete(skiplist *sl, double score) 102 skiplistNode *updateSKIPLIST_MAXLEVEL, *node;103 int i;104 105 node = sl-header;106 for(i = sl-level-1; i = 0; i-) 107 while (node-leveli.forward & node-leveli.forward-score leveli.forward;109 110 updatei = node;111 112 node = node-level0.forward;113 if (node & score = node-score) 114 slDeleteNode(sl, node, update);115 slFreeNode(node);116 return 1;117 else 118 return 0;119 120 return 0;121 122 123 int slSearch(skiplist *sl, double score) 124 skiplistNode *node;125 int i;126 127 node = sl-header;128 for (i = sl-level-1; i = 0 ;i-) 129 while(node-leveli.forward & node-leveli.forward-score leveli.forward;131 132 133 node = node-level0.forward;134 if (node & score = node-score) 135 printf(Found %dn,(int)node-score);136 return 1;137 else 138 printf(Not found %dn, (int)score);139 return 0;140 141 142 143 void slPrint(skiplist *sl) 144 skiplistNode *node;145 int i;146 for (i = 0; i header-leveli.forward;149 while(node) 150 printf(%d - , (int)(node-score);151 node = node-leveli.forward;152 153 printf(NULLn);154 155 156 157 #ifdef SKIP_LIST_TEST_MAIN158 int main() 159 srand(unsigned)time(0);160 int count = 20, i;161 162 printf(# Function Test #n);163 164 printf(= Init Skip List =n);165 skiplist * sl = slCreate();166 for ( i = 0; i count; i+) 167 slInsert(sl,i);168 169 printf(= Print Skip List =n);170 slPrint(sl);171 172 printf(= Search Skip List =n);173 for (i = 0; i count; i+) 174 int value = rand()%(count+10);175 slSearch(sl, value);176 177 printf(= Delete Skip List =n);178 for (i = 0; i 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - NULL 5 LEVEL1: 0 - 2 - 4 - 7 - 9 - 10 - 11 - 12 - 14 - 15 - 17 - 18 - NULL 6 LEVEL2: 7 - 10 - 12 - 14 - 15 - NULL 7 LEVEL3: 10 - 14 - 15 - NULL 8 LEVEL4: 10 - 14 - NULL 9 LEVEL5: NULL10 LEVEL6: NULL11 LEVEL7: NULL12 = Search Skip List =13 Found 114 Found 1815 Not found 2116 Not found 2417 Found 1018 Not found 2019 Found 1420 Found 1021 Found 1922 Found 1823 Not found 2724 Found 525 Found 026 Found 027 Found 1828 Not found 2629 Found 1330 Not found 2831 Not found 2932 Not found 2333 = Delete Skip List =34 Delete0: SUCCESS35 Delete2: SUCCESS36 Delete4: SUCCESS37 Delete6: SUCCESS38 Delete8: SUCCESS39 Delete10: SUCCESS40 Delete12: SUCCESS41 Delete14: SUCCESS42 Delete16: SUCCESS43 Delete18: SUCCESS44 Delete20: NOT FOUND45 Delete22: NOT FOUND46 Delet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 256-2026产业园区信用评价实施指南
- 2026年10月27日 株洲市天元区人才考试中心 诺华制药 药物研发助理 14人
- 广西融安县高级中学2025-2026学年高二上学期期末检测化学试题(含答案)
- 2026学生秋季流感防控课件
- 2025-2026学年陕西省西安市雁塔区七年级(下)期中英语试卷(含答案)
- 2026高中毕业班年级主任工作经验分享课件-单亲家庭学生的教育策略
- 胸部CT临床应用
- 2026干部职工换季时节心脑血管防护专题培训课件
- 2026大学生营养与健康科普课件:告别“小胖墩”守护儿童健康
- 2026医护人员脑卒中防治科普专题培训课件
- 2026年文物事业单位会计职称考试仿真题集
- 【教学设计】《大气热力环流》大单元教学设计(高中地理·湘教版必修一·2课时·素养导向·情境赋能)
- 2026年全国政府采购评审专家统一考试真题含答案
- 动态海报设计
- 电力新员工廉洁第一课
- 《建设工程声像档案归档管理规范》
- 2026年北京市初二学业水平地生会考真题试卷+解析及答案
- 夜间施工监理实施细则
- 农业转基因生物安全培训课件
- 3D-One-培训课件教学课件
- DB42∕T 2403-2025 甘蓝型油菜耐盐碱性鉴定技术规范
评论
0/150
提交评论