今天看了算法,觉得里面的跳转表还是挺有意思的,所以就把代码弄了下来,跳转表也是一种链表,但是它不象普通的链表那样仅仅有一个链接构。它有多级。级数的最大值可以由以下log(1/p, N)-1,第一次看这个的时候,我几乎被它吓到了,要是插入一个数据得多麻烦啊,不是吗?得改多个链结构,后来才明白结点的插入采用了概率插入的方式,呵呵,那样就会让每次运行的时候链结构都会不同,但是插入变的简单有趣,确实,有时候换个想法,问题居然可以变得如此简单,虽然丧失了程序运行的必然性。有空会写一个详细的分析出来,呵呵^_^
#include <iostream> #include <stdlib.h> #include <time.h> #include <stdlib.h> #include <math.h> //#include"exception.h" using namespace std;
class SkipList; class SkipNode { friend SkipList; private: SkipNode(int size) { link=new SkipNode *[size]; } ~SkipNode(){delete [] link;} int data; SkipNode **link; };
class SkipList { public: SkipList(int Large,int MaxE=10000,float p=0.999999); ~SkipList(); bool Search(const int& k)const; SkipList& Insert(const int& e); SkipList& Delete(const int& k); int Level(); void Output(ostream& out)const; int getlevels(){return Levels;} private: SkipNode *SaveSearch(const int& k); int MaxLevel; int Levels; int CutOff; int TailKey; SkipNode *head; SkipNode *tail; SkipNode **last; };
SkipList::SkipList(int Large,int MaxE,float p) { CutOff=p*RAND_MAX; MaxLevel=ceil(log(MaxE*1.0)/log(1/p))-1; TailKey=Large; srand((unsigned int)time(NULL)); Levels=0; head=new SkipNode(MaxLevel+1); tail=new SkipNode(0); last=new SkipNode *[MaxLevel+1]; tail->data=Large; for(int i=0;i <=MaxLevel;i++) head->link[i]=tail; }
SkipList::~SkipList() { SkipNode *next; while(head!=tail) { next=head->link[0]; delete head; head=next; } delete tail; delete [] last; }
class element { friend void main(void); public: operator long()const{return key;} element& operator=(long y) { key=y; return *this; } private: int data; long key; };
bool SkipList::Search(const int& k)const { int e; if(k>=TailKey) return false; SkipNode *p=head; for(int i=Levels;i>=0;i--) while(p->link[i]->data <k) p=p->link[i]; e=p->link[0]->data; return (e==k); }
SkipNode *SkipList::SaveSearch(const int& k) { SkipNode *p=head; for(int i=Levels;i>=0;i--) { while(p->link[i]->data <k) p=p->link[i]; last[i]=p; } return(p->link[0]); }
int SkipList::Level() { int lev=0; while(rand() <=CutOff) lev++; return (lev <=MaxLevel)?lev:MaxLevel; }
SkipList& SkipList::Insert(const int& e) { if(e>=TailKey) throw 0; SkipNode *p=SaveSearch(e); if(p->data==e) throw 0; int lev=Level(); if(lev>Levels) { lev=++Levels; last[lev]=head; } SkipNode *y=new SkipNode(lev+1); y->data=e; for(int i=0;i <=lev;i++) { y->link[i]=last[i]->link[i]; last[i]->link[i]=y; } return *this; }
SkipList& SkipList::Delete(const int& k) { if(k>=TailKey) throw 0; SkipNode *p=SaveSearch(k); if(p->data!=k) throw 0; for(int i=0;i <=Levels && last[i]->link[i]==p;i++) last[i]->link[i]=p->link[i]; while(Levels>0 && head->link[Levels]==tail) Levels--; delete p; return *this; } void SkipList::Output(ostream& out)const {
for(int i=0;i <=Levels;i++) { cout <<"第"<<i<<"级的元素:"; for(SkipNode *current=head;current->link[i],current->link[i]!=tail;current=current->link[i]) cout <<current->link[i]->data <<' '; cout<<endl;
} } ostream& operator <<(ostream& out,const SkipList &x) { x.Output(out); return out; } void main() { SkipList a(99999); a.Insert(20).Insert(24).Insert(30).Insert(40).Insert(60).Insert(75).Insert(80); cout<<a.getlevels()<<endl; cout<<a <<endl; a.Delete(20).Delete(30).Delete(40).Delete(60); cout<<a.getlevels()<<endl; cout<<a <<endl; system("pause"); }