跳表
class Skiplist {
static const int SKIPLIST_P_VAL = RAND_MAX / 2, MAX_LEVEL = 16;
public:
struct Node{
int val;
vector<Node *> next;
Node(int val, int size = MAX_LEVEL): val(val), next(size){}
};
Node head;
int maxlevel = 1;
Skiplist():head(INT_MIN, MAX_LEVEL) {
}
bool search(int target) {
auto prevs = _search(target);
return prevs[0]->next[0] && prevs[0]->next[0]->val == target;
}
vector<Node *> _search(int key){
Node * cur = &head;
vector<Node *> prevs(MAX_LEVEL);
for(int i = maxlevel - 1; i >= 0; i--){
while(cur->next[i] && cur->next[i]->val < key){
cur = cur->next[i];
}
prevs[i] = cur;
}
return prevs;
}
void add(int num) {
auto prevs = _search(num);
int level = random_level();
if(level > maxlevel){
for(int i = maxlevel; i < level; i++){
prevs[i] = &head;
}
maxlevel = level;
}
Node * cur = new Node(num, level);
for(int i = level - 1; i >= 0; i--){
cur->next[i] = prevs[i]->next[i];
prevs[i]->next[i] = cur;
}
}
bool erase(int num) {
auto prevs = _search(num);
if(!prevs[0]->next[0] || prevs[0]->next[0]->val != num){
return false;
}
Node * del = prevs[0]->next[0];
for(int i = 0; i < maxlevel; i++){
if(prevs[i]->next[i] == del){
prevs[i]->next[i] = del->next[i];
}
}
delete del;
while(maxlevel > 1 && !head.next[maxlevel - 1]){
maxlevel--;
}
return true;
}
static int random_level(){
int level = 1;
while(rand() < SKIPLIST_P_VAL && level < MAX_LEVEL){
level++;
}
return level;
}
};