基于vector实现跳表结构

//扔筛子的结束概率
#define PROBABILITY 0.5
//最大层数
#define MAXLEVEL 16
class Skiplistnode{//定义跳表的节点,主要包含数值和next指针数组
public:
    int _val;
    vector<Skiplistnode*> _next;
    Skiplistnode(int num,int level):_val(num),_next(level){}
};
class Skiplist {
public:
    Skiplistnode* head;
    int maxlevel;
    Skiplist() {//初始化头节点和最大层数
        head=new Skiplistnode(-1,1);
        maxlevel=1;
    }
    //查找主要就算用一个update数组从最高层往下查找,一旦某一层找到了就返回true
    bool search(int target) {
        vector<Skiplistnode*> updata(maxlevel+1,head);
        for(int i=maxlevel-1;i>=0;--i){
            updata[i]=findmostright(updata[i+1],i,target);
            Skiplistnode* temp=updata[i]->_next[i];
            if(temp&&(temp->_val==target))return true;
        }
        return false;
    }
    void add(int num) {
        //获得各层的最右左节点
        vector<Skiplistnode*> updata(maxlevel+1,head);
        for(int i=maxlevel-1;i>=0;--i){
            updata[i]=findmostright(updata[i+1],i,num);
        }
        //获得当前节点的随机出来的层数,并记录当前节点有几层next数组需要修改
        int lev=getrandom(),oldlevel=min(maxlevel,lev);
        Skiplistnode* node=new Skiplistnode(num,lev);
        //如果随机出来的层数大于当前最大层数,特殊处理
        if(lev>maxlevel){
            head->_next.resize(lev);
            while(maxlevel<lev){
                head->_next[maxlevel++]=node;
            }        
        }
        //插入节点
        for(int i=0;i<oldlevel;++i){
            Skiplistnode* temp=updata[i]->_next[i];
            updata[i]->_next[i]=node;
            node->_next[i]=temp;
        }
    }
    
    bool erase(int num) {
        bool exist=false;
        // for(int i=0;i<maxlevel;++i){
        //     Skiplistnode* temp=head;
        //     while(temp){
        //         cout<<temp->_val<<"->";
        //         temp=temp->_next[i];
        //     }
        //     cout<<endl;
        // }
        //先从上到下查找出最右左节点
        vector<Skiplistnode*> updata(maxlevel+1,head);
        for(int i=maxlevel-1;i>=0;--i){
            updata[i]=findmostright(updata[i+1],i,num);
        }
        //从上到下删除节点
        for(int i=0;i<maxlevel;++i){
            Skiplistnode* temp=updata[i]->_next[i];
            if(temp&&(temp->_val==num)){
                updata[i]->_next[i]=temp->_next[i];
                exist=true;
            }else break;
        }
       //更新当前跳表的最高层数
        while(maxlevel>=1){
            if(!head->_next[maxlevel-1]){
                --maxlevel;
                head->_next.pop_back();
            }else break;
        }
        return exist;
    }

    Skiplistnode* findmostright(Skiplistnode* cur,int level,int target){
        Skiplistnode* temp=cur->_next[level];
        while(temp&&temp->_val<target){
            cur=temp;
            temp=temp->_next[level];
        }
        return cur;
    }

    int getrandom(){
        mt19937 gen(random_device{}());
        uniform_real_distribution<double> dis(0,1);
        int level=1;
        while(dis(gen)<PROBABILITY){
            if(++level>=MAXLEVEL)break;
        }
        return level;
    }
};

/**
 * Your Skiplist object will be instantwhile(maxlevel>=1){
            if(!head->_next[maxlevel-1]){
                --maxlevel;
                --head->_level;
                head->_next.pop_back();
            }else break;
        }while(maxlevel>=1){
            if(!head->_next[maxlevel-1]){
                --maxlevel;
                --head->_level;
                head->_next.pop_back();
            }else break;
        }iated and called as such:
 * Skiplist* obj = new Skiplist();
 * bool param_1 = obj->search(target);
 * obj->add(num);
 * bool param_3 = obj->erase(num);
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanzhe1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值