• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • htmesh
SkipList.cpp
Go to the documentation of this file.
1 /*
2  File: SkipList.C
3  Author: Bruno Grossniklaus, 13.11.97
4  Mod: Gyorgy Fekete, Oct-09-2002
5  Version: 1.0
6  History:
7  Nov-13-1997; Gro; Version 1.0
8  Oct-09-2002; JHU; Version 1.1
9 
10 */
11 
12 #include <iostream> // cout
13 #include <iomanip> // setw
14 #include <cstdlib> // rand(), drand48()
15 
16 #include "SkipListElement.h"
17 #include "SkipList.h"
18 
19 #include <config-htmesh.h>
20 
21 #ifndef HAVE_DRAND48
22 double drand48()
23 {
24  double result;
25 #ifdef _WIN32
26  result = static_cast<double>( rand() );
27  result /= RAND_MAX;
28 #else
29  result = static_cast<double>( random() );
30  result /= LONG_MAX;
31 #endif
32  return result;
33 }
34 #endif /* HAVE_DRAND48 */
35 
36 
38 // get new element level using given probability
40 long getNewLevel(long maxLevel, float probability)
41 {
42  long newLevel = 0;
43  while ( (newLevel < maxLevel - 1) && (drand48() < probability) ) // fast hack. fix later
44  newLevel++;
45  return(newLevel);
46 }
47 
49 SkipList::SkipList(float probability)
50  : myProbability(probability)
51 {
52  myHeader = new SkipListElement(); // get memory for header element
53  myHeader->setKey( KEY_MAX);
54  myLength = 0;
55  iter = myHeader;
56 }
57 
59 SkipList::~SkipList()
60 {
61  delete myHeader; // free memory for header element
62 }
63 
65 void SkipList::insert(const Key searchKey, const Value value)
66 {
67  int i;
68  long newLevel;
69  SkipListElement* element;
70  SkipListElement* nextElement;
71  SkipListElement update(SKIPLIST_MAXLEVEL);
72 
73  // scan all levels while key < searchKey
74  // starting with header in his level
75  element = myHeader;
76  for(i=myHeader->getLevel(); i>=0; i--) {
77  nextElement = element->getElement(i);
78  while( (nextElement != NIL) && (nextElement->getKey() < searchKey) ) {
79  element=nextElement;
80  nextElement = element->getElement(i);
81  }
82  // save level pointer
83  update.setElement(i, element);
84  }
85 
86  // key is < searchKey
87  element=element->getElement(0);
88 
89  if( (element != NIL) && (element->getKey() == searchKey) ) {
90  // key exists. set new value
91  element->setValue(value);
92  } else {
93  // new key. add to list
94  // get new level and fix list level
95 
96  // get new level
97  newLevel = getNewLevel(SKIPLIST_MAXLEVEL, myProbability);
98  if (newLevel > myHeader->getLevel() ) {
99  // adjust header level
100  for (i=myHeader->getLevel() + 1; i<=newLevel; i++) {
101  // adjust new pointer of new element
102  update.setElement(i, myHeader);
103  }
104  // set new header level
105  myHeader->setLevel(newLevel);
106  }
107  // make new element [NEW *******]
108  myLength++;
109  element = new SkipListElement(newLevel, searchKey, value);
110  for (i=0; i<= newLevel; i++ ) { // scan all levels
111  // set next pointer of new element
112  element->setElement(i, update.getElement(i)->getElement(i));
113  update.getElement(i)->setElement(i, element);
114  }
115  }
116 }
117 
119 // greatest key less than searchKey.. almost completely, but not
120 // quite entirely unlike a search ...
121 Key SkipList::findMAX(const Key searchKey) const
122 {
123  int i;
124  SkipListElement* element;
125  SkipListElement* nextElement;
126  Key retKey;
127 
128  element = myHeader;
129  for(i=myHeader->getLevel(); i>=0; i--) {
130  nextElement = element->getElement(i);
131  while( (nextElement != NIL) && (nextElement->getKey() < searchKey) ) {
132  element=nextElement;
133  nextElement = element->getElement(i);
134  }
135  }
136  // now nextElement is >= searhcKey
137  // and element is < searchKey
138  // therefore elemnt key is largest key less than current
139 
140  // if this were search:
141  // element=element->getElement(0); // skip to >=
142  if(element != NIL) {
143  retKey = element->getKey();
144  return retKey == KEY_MAX ? (-KEY_MAX) : retKey;
145  } else {
146  return((Key) KEY_MAX);
147  }
148 }
149 
150 
151 // smallest greater than searchKey.. almost completely, but not
152 // quite entirely unlike a search ...
153 Key SkipList::findMIN(const Key searchKey) const
154 {
155  int i;
156  SkipListElement* element(myHeader);
157  SkipListElement* nextElement = 0;
158  Key retKey;
159 
160  for(i=myHeader->getLevel(); i>=0; i--) {
161  nextElement = element->getElement(i);
162  while( (nextElement != NIL) && (nextElement->getKey() <= searchKey) ) {
163  element=nextElement;
164  nextElement = element->getElement(i);
165  }
166  }
167  // now nextElement is > searchKey
168  // element is <= , make it >
169  //
170  element = nextElement;
171  if(element != NIL) {
172  retKey = element->getKey();
173  return retKey == KEY_MAX ? (-KEY_MAX) : retKey;
174  } else {
175  return (Key)KEY_MAX;
176  }
177 }
178 
180 /* Very similar to free, but frees a range of keys
181  from lo to hi, inclusive */
182 void SkipList::freeRange(const Key loKey, const Key hiKey)
183 {
184  int i;
185  SkipListElement* element;
186  SkipListElement* nextElement;
187 
188  // scan all levels while key < searchKey
189  // starting with header in his level
190  element = myHeader;
191  for(i=myHeader->getLevel(); i>=0; i--) {
192  nextElement = element->getElement(i);
193  while( (nextElement != NIL) && (nextElement->getKey() < loKey) ) {
194  element=nextElement;
195  nextElement = element->getElement(i);
196  }
197  }
198  // key is < loKey
199  element=element->getElement(0);
200 
201  while( (element != NIL) && (element->getKey() <= hiKey) ) {
202  nextElement = element->getElement(0);
203  free(element->getKey());
204  element = nextElement;
205  }
206 }
207 
209 void SkipList::free(const Key searchKey)
210 {
211  int i;
212  SkipListElement* element;
213  SkipListElement* nextElement;
214  SkipListElement update(SKIPLIST_MAXLEVEL);
215 
216  // scan all levels while key < searchKey
217  // starting with header in his level
218  element = myHeader;
219  for(i=myHeader->getLevel(); i>=0; i--) {
220  nextElement = element->getElement(i);
221  while( (nextElement != NIL) && (nextElement->getKey() < searchKey) ) {
222  element=nextElement;
223  nextElement = element->getElement(i);
224  }
225  // save level pointer
226  update.setElement(i, element);
227  }
228 
229  // key is < searchKey
230  element=element->getElement(0);
231 
232  // if key exists
233  if( (element != NIL) && (element->getKey() == searchKey) ) {
234  for(i=0; i<=myHeader->getLevel(); i++) { // save next pointers
235  if (update.getElement(i)->getElement(i) == element) {
236  update.getElement(i)->setElement(i, element->getElement(i));
237  }
238  }
239 
240  // free memory of element
241  delete element;
242  myLength--;
243 
244  // set new header level
245  while ( (myHeader->getLevel() > 0) && (myHeader->getElement(myHeader->getLevel()) == NIL) ) {
246  myHeader->setLevel(myHeader->getLevel()-1);
247  }
248  }
249 }
250 
252 void SkipList::stat()
253 {
254  int count = 0;
255  SkipListElement* element;
256  SkipListElement* nextElement;
257 
258  element = myHeader;
259  nextElement = element->getElement(0);
260 
261  while( (nextElement != NIL) ) {
262  count++;
263  element=nextElement;
264  nextElement = element->getElement(0);
265  }
266  std::cout << "Have number of elements ... " << count << std::endl;
267  std::cout << "Size ..................... " << myLength << std::endl;
268  {
269  int *hist;
270  hist = new int[20];
271  int i;
272  long totalPointers, usedPointers;
273  for(i=0; i<20; i++){
274  hist[i] = 0;
275  }
276  element = myHeader;
277  count = 0;
278  nextElement = element->getElement(0);
279  while( (nextElement != NIL) ) {
280  count++;
281  hist[nextElement->getLevel()]++;
282  element=nextElement;
283  nextElement = element->getElement(0);
284  }
285  //
286  // There are SKIPLIST_MAXLEVEL * count available pointers
287  //
288  totalPointers = SKIPLIST_MAXLEVEL * count;
289  usedPointers = 0;
290  //
291  // of these every node that is not at the max level wastes some
292  //
293  for(i=0; i<20; i++){
294  if(hist[i] > 0) std::cout << std::setw(2) << i << ": " << std::setw(6) << hist[i] << std::endl;
295  usedPointers += hist[i] * (1 + i);
296  }
297  std::cout << "Used pointers " << usedPointers << std::endl;
298  std::cout << "Total pointers " << totalPointers << " efficiency = " <<
299  (double) usedPointers / (double) totalPointers << std::endl;
300  delete [] hist;
301  }
302  return;
303 }
KEY_MAX
#define KEY_MAX
Definition: SkipListElement.h:26
SkipListElement::getElement
SkipListElement * getElement(long level)
get next element in level
Definition: SkipListElement.cpp:24
drand48
double drand48()
Definition: SkipList.cpp:22
SkipListElement::setLevel
void setLevel(long level)
Set level of element.
Definition: SkipListElement.h:52
SkipListElement::setKey
void setKey(Key key)
set key of element
Definition: SkipListElement.h:42
SkipList.h
SkipListElement
Definition: SkipListElement.h:35
SkipList::~SkipList
~SkipList()
Definition: SkipList.cpp:59
Value
int Value
Definition: SkipListElement.h:31
SKIPLIST_MAXLEVEL
#define SKIPLIST_MAXLEVEL
Definition: SkipListElement.h:17
SkipList::SkipList
SkipList(float probability=0.5)
Definition: SkipList.cpp:49
SkipListElement::getKey
Key getKey() const
get key of element
Definition: SkipListElement.h:40
NIL
#define NIL
Definition: SkipListElement.h:18
SkipList::free
void free(const Key searchKey)
free element with key
Definition: SkipList.cpp:209
SkipListElement::setElement
void setElement(long level, SkipListElement *element)
set next element in level
Definition: SkipListElement.cpp:36
SkipListElement.h
SkipListElement::getLevel
long getLevel() const
get level of element
Definition: SkipListElement.h:50
SkipList::freeRange
void freeRange(const Key loKey, const Key hiKey)
Definition: SkipList.cpp:182
SkipListElement::setValue
void setValue(Value value)
set value of element
Definition: SkipListElement.h:47
SkipList::findMAX
Key findMAX(const Key searchKey) const
search element with key NGT searchKey
Definition: SkipList.cpp:121
SkipList::stat
void stat()
statistics;
Definition: SkipList.cpp:252
Key
int64 Key
Definition: SkipListElement.h:30
SkipList::insert
void insert(const Key searchKey, const Value value)
insert new element
Definition: SkipList.cpp:65
getNewLevel
long getNewLevel(long maxLevel, float probability)
Definition: SkipList.cpp:40
SkipList::findMIN
Key findMIN(const Key searchKey) const
search element with key NLT searchKey
Definition: SkipList.cpp:153
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal