腾跃表
跳跃表
跳跃表是一种随机化的数据结构,它的效率与平衡二叉查找树差不多,插入,查找,删除操作的期望时间是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; }