Algorithms_in_C++  1.0.0
Set of algorithms implemented in C++.
data_structure::SkipList Class Reference
Collaboration diagram for data_structure::SkipList:
[legend]

Public Member Functions

 SkipList ()
 
int randomLevel ()
 
void insertElement (int key, void *value)
 
void deleteElement (int key)
 
void * searchElement (int key)
 
void displayList ()
 

Private Attributes

int level
 Maximum level of the skiplist.
 
std::shared_ptr< Nodeheader
 Pointer to the header node.
 

Detailed Description

SkipList class implementation with basic methods

Constructor & Destructor Documentation

◆ SkipList()

data_structure::SkipList::SkipList ( )
inline

Skip List constructor. Initializes header, start Node for searching in the list

64  {
65  level = 0;
66  // Header initialization
68  }

Member Function Documentation

◆ deleteElement()

void data_structure::SkipList::deleteElement ( int  key)
inline

Deletes an element by key and prints if has been removed successfully

Parameters
keyis number that is used for comparision.
131  {
133 
135  update.fill(nullptr);
136 
137  for (int i = level; i >= 0; i--) {
138  while (x->forward[i] != nullptr && x->forward[i]->key < key)
139  x = x->forward[i];
140  update[i] = x;
141  }
142 
143  x = x->forward[0];
144 
145  bool doesnt_exist = (x == nullptr || x->key != key);
146 
147  if (!doesnt_exist) {
148  for (int i = 0; i <= level; i++) {
149  if (update[i]->forward[i] != x)
150  break;
151  update[i]->forward[i] = x->forward[i];
152  }
153  /* Remove empty levels*/
154  while (level > 0 && header->forward[level] == nullptr) level--;
155  std::cout << "Deleted" << std::endl;
156  } else {
157  std::cout << "Doesn't exist" << std::endl;
158  }
159  }
Here is the call graph for this function:

◆ displayList()

void data_structure::SkipList::displayList ( )
inline

Display skip list level

187  {
188  std::cout << "Displaying list:\n";
189  for (int i = 0; i <= level; i++) {
190  std::shared_ptr<Node> node = header->forward[i];
191  std::cout << "Level " << (i) << ": ";
192  while (node != nullptr) {
193  std::cout << node->key << " ";
194  node = node->forward[i];
195  }
196  std::cout << std::endl;
197  }
198  }
Here is the call graph for this function:

◆ insertElement()

void data_structure::SkipList::insertElement ( int  key,
void *  value 
)
inline

Inserts elements with given key and value; It's level is computed by randomLevel() function.

Parameters
keyis number that is used for comparision
valuepointer to a value, that can be any type
89  {
90  std::cout << "Inserting" << key << "...";
93  update.fill(nullptr);
94 
95  for (int i = level; i >= 0; i--) {
96  while (x->forward[i] != nullptr && x->forward[i]->key < key)
97  x = x->forward[i];
98  update[i] = x;
99  }
100 
101  x = x->forward[0];
102 
103  bool doesnt_exist = (x == nullptr || x->key != key);
104  if (doesnt_exist) {
105  int rlevel = randomLevel();
106 
107  if (rlevel > level) {
108  for (int i = level + 1; i < rlevel + 1; i++) update[i] = header;
109 
110  // Update current level
111  level = rlevel;
112  }
113 
115  std::shared_ptr<Node>(new Node(key, rlevel, value));
116  for (int i = 0; i <= rlevel; i++) {
117  n->forward[i] = update[i]->forward[i];
118  update[i]->forward[i] = n;
119  }
120  std::cout << "Inserted" << std::endl;
121 
122  } else {
123  std::cout << "Exists" << std::endl;
124  }
125  }
Here is the call graph for this function:

◆ randomLevel()

int data_structure::SkipList::randomLevel ( )
inline

Returns random level of the skip list. Every higher level is 2 times less likely.

Returns
random level for skip list
75  {
76  int lvl = 0;
77  while (static_cast<float>(std::rand()) / RAND_MAX < PROBABILITY &&
78  lvl < MAX_LEVEL)
79  lvl++;
80  return lvl;
81  }
Here is the call graph for this function:

◆ searchElement()

void* data_structure::SkipList::searchElement ( int  key)
inline

Searching element in skip list structure

Parameters
keyis number that is used for comparision
Returns
pointer to the value of the node
166  {
168  std::cout << "Searching for " << key << std::endl;
169 
170  for (int i = level; i >= 0; i--) {
171  while (x->forward[i] && x->forward[i]->key < key) x = x->forward[i];
172  }
173 
174  x = x->forward[0];
175  if (x && x->key == key) {
176  std::cout << "Found" << std::endl;
177  return x->value;
178  } else {
179  std::cout << "Not Found" << std::endl;
180  return nullptr;
181  }
182  }
Here is the call graph for this function:

The documentation for this class was generated from the following file:
data_structure::PROBABILITY
constexpr float PROBABILITY
Current probability for "coin toss".
Definition: skip_list.cpp:28
std::shared_ptr< Node >
data_structure::SkipList::level
int level
Maximum level of the skiplist.
Definition: skip_list.cpp:56
node
Definition: avltree.cpp:13
Node
Definition: linkedlist_implentation_usingarray.cpp:14
std::cout
std::array
STL class.
data_structure::SkipList::randomLevel
int randomLevel()
Definition: skip_list.cpp:75
std::rand
T rand(T... args)
std::endl
T endl(T... args)
data_structure::SkipList::header
std::shared_ptr< Node > header
Pointer to the header node.
Definition: skip_list.cpp:57
data_structure::MAX_LEVEL
constexpr int MAX_LEVEL
Maximum level of skip list.
Definition: skip_list.cpp:27