跳轉表的設計

實驗要求

用隨機算法實現一個跳躍表。

設計

類的設計

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,存有這個節點指向其他節點的系列指針

Nodelevel=nextsize Node_{level}=next_{size}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章