跳跃表

来源:互联网 发布:淘宝色差解释 编辑:程序博客网 时间: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
原创粉丝点击