在跳表結構中有一組等級鍊錶,0級鍊錶包含所有數對,一級鍊錶的數對是0級鍊錶數對的乙個子集。i級鍊錶的數對是i-1級鍊錶數對的子集。通過這種方式允許我們能夠對鍊錶進行折半查詢。
對於跳表而言最難的是當插入資料時,該資料到底屬於哪級指標,一般是按照一定的概率隨機分配。
template
struct skipnode
}float cutoff;//用來確定層數
int levels;//當前最大的非空鍊錶
int dsize;//字典的數對個數
int maxlevel;//允許的最大鏈表層數
k tailkey;//最大關鍵字
skipnode* headernode;//頭節點指標
skipnode* tailnode;//尾節點指標
skipnode** last;//表示i層的最後節點
template
skiplist::skiplist(k largekey,int maxpairs,float prob)
template
int skiplist::level() const
template
void skiplist::insert(const pair& thepair)
//若不存在則確定新節點所在的級鍊錶
int thelevel=level();
if(thelevel>levels)
//在節點thenode之前插入新節點
skipnode* newnode=new skipnode(thepair,thelevel+1)//新節點的指標域必須大於當前自身級數
for(int i=0;i<=thelevel;i++)
//以上兩句就是乙個簡單的鍊錶插入語句
dsize++;
return;
}template
pair* skiplist::find(const k& thekey)const
template
skipnode* skiplist::search(const k&thekey)const
return beforenode->next[0];
}template
void skiplist::erase(const k& thekey)
上面**很難理解,但是理解後就是一句話。
每個節點裡面存乙個資料element和乙個二級指標next,next[0]代表0級鍊錶指向下乙個節點,next[1]代表1級鍊錶指向更遠的乙個節點,next[i]指向更更遠的節點,該節點最高有幾級鍊錶,next陣列就有多大。
真的看得頭暈,但還是得堅持啊。
線性表描述字典
template struct pair template struct pairnode pairnode pairthepair,pair p template class dictionary virtual bool empty const 0 virtual int size const ...
跳表的介紹與實現
作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...
跳表的原理及其實現
作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...