Skiplist主要是利用多级链表,实现链式结构快速的查找。链表的高度为O(logn)的概率很大,删除和运行的时间也是O(logn),而且需要的空间数目小于2n。总的来说,skiplist可以获得比较好的整体性能,而且不需要太复杂的平衡操作,因此运行速度和运行空间能够取得比较好的折中。具体的可以参考http://blog.csdn.net/haidao2009/article/details/8206856
源码如下:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define MAX_LEVEL 16
//using namespace std;
typedef struct nodeStructure
{
int key;
int value;
struct nodeStructure *fward[1];
}nodeStructure;
typedef struct Skiplist
{
int level;
nodeStructure *header;
}Skiplist;
nodeStructure * createNode(int level,int key,int value);
Skiplist *createSkiplist();
int random_level();
bool insertSkipList(Skiplist* sl,int key,int value);
bool deleteSkipList(Skiplist *sl,int key);
int random_level()
{
int k = 1;
while (rand()%2)
{
k ++;
}
k = (k< MAX_LEVEL)?k:MAX_LEVEL;
return k;
}
nodeStructure * createNode(int level,int key,int value)
{
//使用了弹性数组,c++中可能会出现问题
nodeStructure * ns = (nodeStructure*)malloc(sizeof(nodeStructure)+level*sizeof(nodeStructure*));
ns->key = key;
ns->value= value;
return ns;
}
/**
*
*skiplist initialize
*
*/
Skiplist *createSkiplist()
{
Skiplist *sl = (Skiplist*)malloc(sizeof(Skiplist));
sl->level = 0;
sl->header = createNode(MAX_LEVEL-1,0,0);
for(int i = 0;i < MAX_LEVEL;i ++)
{
sl->header->fward[i] = NULL;
}
return sl;
}
bool insertSkipList(Skiplist* sl,int key,int value)
{
nodeStructure *update[MAX_LEVEL];
nodeStructure *p,*q = NULL;
p = sl->header;
int k = sl->level;
//printf("%d\n",sl->level);
for(int i = k-1; i >= 0;i --)
{
while((q = p->fward[i]) && (q->key < key))
{
p = q;
}
update[i] = p;
}
if(q && q->key == key)
{
return false;
}
//random level
// cout << "das"<<endl;
k = random_level();
//cout << k << endl;
if(k > sl->level)
{
for(int i = sl->level;i < k;i ++)
{
update[i] = sl->header;
}
sl->level = k;
}
q = createNode(k,key,value);
//
for (int i = 0;i < k;i ++)
{
q->fward[i] = update[i]->fward[i];
update[i]->fward[i] = q;
}
return true;
}
int searchSkiplist(Skiplist*sl,int key)
{
int k = sl->level;
nodeStructure *p,*q = NULL;
p = sl->header;
for(int i = k-1;i >= 0;i --)
{
while((q = p->fward[i])&&(q->key <= key))
{
if(q->key == key)
{
return q->value;
}
p =q;
}
}
return -1;
}
void printSL(Skiplist *sl)
{
nodeStructure *p,*q = NULL;
int k = sl->level;
for(int i = k-1;i >= 0;i --)
{
p = sl->header;
while(p)
{
printf("%d ->",p->key);
p = p->fward[i];
}
printf("\n");
}
printf("\n");
}
bool deleteSkipList(Skiplist *sl,int key)
{
nodeStructure *p,*q;
nodeStructure *update[MAX_LEVEL];
int k = sl->level;
for(int i = k-1;i >= 0;i --)
{
p = sl->header;
while((q = p->fward[i]) && q->key < key)
{
p = q;
}
update[i] = p;
}
//find the target key
if(q && q->key == key)
{
//delete them
for (int i = 0;i < sl->level;i ++)
{
if(update[i]->fward[i] == q)
{
update[i]->fward[i] = q->fward[i];
}
}
free(q);
//update level
for(int i = sl->level; i >= 0;i --)
{
if(sl->header->fward[i] == NULL)
{
sl->level --;
}
}
return true;
}
else
{
return false;
}
}
int main ()
{
srand(time(NULL));
Skiplist *sl = createSkiplist();
printf("%d\n",sl->level);
// cout << "asda";
for(int i = 1;i < 14;i ++)
{
insertSkipList(sl,i,i*3);
// cout << "asd";
}
printf("value = %d\n", searchSkiplist(sl,8));
printSL(sl);
deleteSkipList(sl,8);
printSL(sl);
}