跳跃表
来源:互联网 发布:淘宝色差解释 编辑:程序博客网 时间:2024/05/27 20:52
跳跃表是一种随机化的数据结构,它的效率与平衡二叉查找树差不多,插入,查找,删除操作的期望时间是O(logn)。跳跃表按层构造,查找元素是沿着最高一层的元素开始,逐步向下向后移动,插入、删除操作必须在多层元素之间即多个链表中插入删除。跳跃表使用用了随机化的算法,并不能保证所有操作的最坏情况复杂度为O(logn),但在实际中,它工作得很好。
跳跃的C语言实现:
# include <iostream>using namespace std;# include <stdlib.h># define MAXSIZE 50# include <time.h>typedef int elementtype;struct node{elementtype ele;node *next[1];};struct skiplist{int levelnum;node *head;};int main(){skiplist* init(skiplist *T);skiplist* insert(skiplist *T,elementtype x);skiplist* del(skiplist* T,elementtype x);int find(skiplist *T,elementtype x);skiplist *T=0;T=init(T);srand(time(NULL));T=insert(T,1);T=insert(T,2);T=insert(T,3);cout<<find(T,2)<<endl;T=del(T,2);cout<<find(T,2)<<endl;system("pause");return 0;}skiplist* init(skiplist *T){int i=0;T=(skiplist *)malloc(sizeof(skiplist)); //跳跃表的初始化if(T==NULL)return NULL;T->head=(node *)malloc(sizeof(node)+MAXSIZE*sizeof(node *));if(T->head==NULL)return NULL;T->levelnum=0;for(i=0;i<MAXSIZE;i++)T->head->next[i]=T->head;return T;}skiplist* insert(skiplist* T,elementtype x) //插入{node *update[MAXSIZE+1];int i,newlevel;node *p;printf("%d\n",x);p=T->head;for(i=T->levelnum;i>=0;i--){while(p->next[i]!=T->head&&p->next[i]->ele<x)p=p->next[i];update[i]=p;}p=p->next[0];if(p!=T->head&&p->ele==x)return T;for (newlevel=0;(rand()<RAND_MAX/2)&&newlevel<MAXSIZE;newlevel++) //计算新结点的高度;if(newlevel>T->levelnum){for(i=T->levelnum+1;i<=newlevel;i++)update[i]=T->head;T->levelnum=newlevel;}p=(node *)malloc(sizeof(node)+newlevel*sizeof(node *));if(p==NULL)exit(-1);p->ele=x;for(i=0;i<=newlevel;i++){p->next[i]=update[i]->next[i];update[i]->next[i]=p;}return T;}skiplist* del(skiplist* T,elementtype x) //删除{int i;node *update[MAXSIZE+1],*p;p=T->head;for (i=T->levelnum;i>=0;i--){while(p->next[i]!=T->head&&p->next[i]->ele<x)p=p->next[i];update[i]=p;}p=p->next[0];if(p==T->head||p->ele!=x)exit(-1);for(i=0;i<=T->levelnum;i++){if(update[i]->next[i]!=p)break;update[i]->next[i]=p->next[i];}free(p);while((T->levelnum>0)&&(T->head->next[T->levelnum]==T->head)) //更新跳跃表的高度T->levelnum--;return T;}int find(skiplist *T,elementtype x) //查找{int i;node *p=T->head;for(i=T->levelnum;i>=0;i--){while(p->next[i]!=T->head&&p->next[i]->ele<x)p=p->next[i];}p=p->next[0];if(p!=T->head&&p->ele==x)return 1;return 0;}
0 0
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 跳跃表
- 在linux codeblocks上opencv的 配置(整理转载)
- MapReduce作业运行流程
- 顺序存储的合并
- hibernate配置文件出现的问题
- Spring3.x企业应用开发实战-Spring+Hibernat架构分析
- 跳跃表
- UIView 用户事件相应总结1
- 2013学习总结----JavaScript
- 浙大PAT 4-06. 搜索树判断 (解题思路)
- ie6, ie7兼容性问题以及处理办法汇总
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
- JavaScript遍历XML总结
- FireBug 调试JS入门 —如何调试JS
- Android apk动态加载机制的研究