-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSkiplist.cpp
More file actions
124 lines (110 loc) · 3.04 KB
/
Skiplist.cpp
File metadata and controls
124 lines (110 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
template <typename T> class Node {
public:
T value;
std::vector<Node *> forward; // 各层的横向指针
Node(T val, int level) : value(val), forward(level + 1, nullptr) {}
};
template <typename T> class SkipList {
public:
SkipList(int max_lvl = 16, float p = 0.5)
: max_level(max_lvl), current_level(0), probability(p) {
header = new Node<T>(T(), max_level);
srand(time(0));
}
~SkipList();
int random_level();
bool contains(T vallue);
void insert(T value);
void erase(T value);
private:
Node<T> *header;
int max_level;
int current_level;
float probability;
};
template <class T> int SkipList<T>::random_level() {
int level = 0;
while ((rand() % 100) < (probability * 100) && level < max_level) {
level++;
}
return level;
}
template <class T> SkipList<T>::~SkipList() {
Node<T> *current = header->forward[0];
while (current) {
Node<T> *temp = current;
current = current->forward[0];
delete temp;
}
delete header;
}
template <class T> bool SkipList<T>::contains(T value) {
Node<T> *current = header;
for (int i = current_level; i >= 0; --i) {
while (current->forward[i] && current->forward[i]->value < value) {
current = current->forward[i];
}
}
current = current->forward[0];
return current && current->value == value;
}
template <class T> void SkipList<T>::insert(T value) {
std::vector<Node<T> *> update(max_level + 1, nullptr);
Node<T> *current = header;
for (int i = current_level; i >= 0; --i) {
while (current->forward[i] && current->forward[i]->value < value) {
current = current->forward[i];
}
update[i] = current;
}
int new_level = random_level();
if (new_level > current_level) {
for (int i = current_level + 1; i <= new_level; ++i) {
update[i] = header;
}
current_level = new_level;
}
Node<T> *newNode = new Node<T>(value, new_level);
for (int i = 0; i <= new_level; ++i) {
newNode->forward[i] = update[i]->forward[i];
update[i]->forward[i] = newNode;
}
}
template <class T> void SkipList<T>::erase(T value) {
std::vector<Node<T> *> update(max_level + 1, nullptr);
Node<T> *current = header;
for (int i = current_level; i >= 0; --i) {
while (current->forward[i] && current->forward[i]->value < value) {
current = current->forward[i];
}
update[i] = current;
}
current = current->forward[0];
if (current && current->value == value) {
for (int i = 0; i <= current_level; ++i) {
if (update[i]->forward[i] != current)
break;
update[i]->forward[i] = current->forward[i];
}
delete current;
while (current_level > 0 && header->forward[current_level] == nullptr) {
current_level--;
}
}
}
int main() {
SkipList<int> skl(3, 0.5);
skl.insert(3);
skl.insert(6);
skl.insert(7);
skl.insert(9);
skl.insert(12);
std::cout << "Contains 6: " << skl.contains(6) << std::endl; // 1
skl.erase(6);
std::cout << "Contains 6: " << skl.contains(6) << std::endl; // 0
return 0;
}