跳跃表

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


你可能感兴趣的:(数据结构,跳表,跳跃表,平衡查找树)