實驗要求
用隨機算法實現一個跳躍表。
設計
類的設計
SkipNode
class SkipNode
{
friend class SkipList;
public:
//SkipNode() {}
SkipNode(int key,int element,int size);
private:
int key;
int element;
vector<SkipNode*> next;
};
其中對於目前測試的整數跳轉表而言,key=content
而其中的數組next,存有這個節點指向其他節點的系列指針
SkipList
class SkipList
{
public:
//SkipList(){}
void show();
SkipList( double prob, int maxE );
//插入
int get_random();//得到隨機數
SkipNode* insert_node(int key,int element);
//查找
pair<bool, SkipNode*> find_node(int key);
//刪除
void delete_node(int key);
~SkipList();
private:
//這是首尾
SkipNode* head;
SkipNode* tail;
//最大的等級和現在的等級
int maxLevel;
int now_max_level;
//查詢和替換時候的中介數組
vector<SkipNode*>last;
//這是替換概率
double prob;
default_random_engine e;
};
構造函數傳入的maxE代表最大的數量
在構造之初就構建首尾,其中首位並沒有實際意義,只是一個標誌
核心在於last數組,
last[i]中記錄了在一次查詢中,指向查詢結果位置的第i級指針
接口的設計
class SkipList
{
public:
//SkipList(){}
void show();
SkipList( double prob, int maxE );
//插入
int get_random();//得到隨機數
SkipNode* insert_node(int key,int element);
//查找
pair<bool, SkipNode*> find_node(int key);
//刪除
void delete_node(int key);
~SkipList();
private:
//這是首尾
SkipNode* head;
SkipNode* tail;
//最大的等級和現在的等級
int maxLevel;
int now_max_level;
//查詢和替換時候的中介數組
vector<SkipNode*>last;
//這是替換概率
double prob;
default_random_engine e;
};
爲跳轉表提供
-
構造
-
插入
-
刪除
-
查詢
四種操作
注意點:內存管理
在進行刪除的時候,需要記得將刪除節點的空間 delete掉
同樣要爲jumptable提供一個完整的析構函數
刪除節點
void SkipList::delete_node(int key)
{
cout << "delete" << key<<endl;
pair<bool, SkipNode* >check_result= find_node(key);
if (check_result.first == false)
return;
else
{
for (int i = 0; i < check_result.second->next.size();i++)
last[i]->next[i] = check_result.second->next[i];
}
delete check_result.second;
return;
}
倒數第二行進行了delete操作
析構函數
SkipList::~SkipList()
{
SkipNode* tem = this->head;
while (tem != this->tail)
{
SkipNode* re = tem;
tem = tem->next[0];
delete re;
}
}
在操作完成之後進行,將其作爲一個鏈表,進行逐個的 delete
測試
測試函數位於JumpTable.cpp之中
構建跳轉表
隨機生成1~100中的五十個數字
並且依次插入跳轉表中
代碼
SkipList here(0.5,100);
for (int i = 50; i > 0; i--)
{
int k = rand() % 100+1;
here.insert_node(k,k);
}
結果截圖
從跳轉表中刪除元素
將1~20從上述跳轉表中刪去
代碼
SkipList here(0.5,100);
for (int i = 0; i < 20; i++)
here.delete_node(i);
here.show();
截圖
Source Code
見Visual Studio項目:Jump Table
https://pan.baidu.com/s/1vkt3fueDMPrh3z97jA0epA&shfl=sharepset