package rttm.skiplist;
import java.util.Random;
public abstract class AbstractSkipList {
// / <summary>
// / Represents a node in the SkipList.
// / </summary>
class Node {
// References to nodes further along in the skip list.
private Node[] forward;
// The key/value pair.
int key;
// / <summary>
// / No-arg constructor
// / </summary>
public Node() {
}
// / <summary>
// / Initializes an instant of a Node with its node level.
// / </summary>
// / <param name="level">
// / The node level.
// / </param>
public Node(int level) {
forward = new Node[level];
}
// / <summary>
// / Initializes an instant of a Node with its node level and
// / key/value pair.
// / </summary>
// / <param name="level">
// / The node level.
// / </param>
// / <param name="key">
// / The key for the node.
// / </param>
// / <param name="val">
// / The value for the node.
// / </param>
public Node(int level, int key) {
forward = new Node[level];
this.key = key;
}
public Node get(int i) {
return this.forward[i];
}
public void set(int i, Node value) {
this.forward[i] = value;
}
}
public AbstractSkipList() {
int size = 0;
header = new Node(MaxLevel);
listLevel = 1;
for (int i = 0; i < MaxLevel; i++) {
header.set(i, header);
}
// initialize transaction objects
while (size < INITIAL_SIZE) {
int v = random.nextInt();
if ((boolean) Insert(v)) {
size++;
Shadow += v;
}
}
}
protected abstract Node Search(int key, Node[] update);
protected abstract void Insert(int key, Node[] update, Node newNode,
int newLevel);
public abstract boolean Remove(int key);
public abstract boolean Insert(int key);
protected final int MaxLevel = 16;
private final int Probability = 500;
public static int INITIAL_SIZE = 1000;
protected Node header;
protected Random random = new Random();
protected int listLevel;
public int Shadow = 0;
public int Actual() {
Node n = header.get(0);
int total = 0;
while (n != header) {
total += n.key;
n = n.get(0);
}
return total;
}
protected int GetNewLevel() {
int level = 1;
// Determines the next node level.
while ((random.nextInt() % 1000) < Probability && level < MaxLevel
&& level <= listLevel) {
level++;
}
return level;
}
public boolean Contains(int key) {
Node[] dummy = new Node[MaxLevel];
return Search(key, dummy) != null;
}
}