public abstract class SkipListUtil {
public static int generateRandomLevel() {
int result = SkipListConfig.MIN_LEVEL;
Random random = new Random();
while (random.nextInt(SkipListConfig.MAX_LEVEL) < SkipListConfig.MAX_LEVEL * SkipListConfig.P && result < SkipListConfig.MAX_LEVEL) {
result++;
}
return result;
}
public static <T> double computeAvgLevel(SkipList<T> skipList) {
double result = 0;
for (SkipListNode<T> skipListNode : skipList) {
result += skipListNode.getLevels().length;
}
return result / skipList.length;
}
}
public abstract class SkipListConfig {
public static final double P = 0.5;
public static final int MAX_LEVEL = 64;
public static final int MIN_LEVEL = 1;
}
@Data
@Accessors(chain = true)
@EqualsAndHashCode
public class SkipListNode<T> implements Comparable<SkipListNode<T>> {
private T element;
private double score;
private SkipListNode<T> prev;
private SkipListLevel<T>[] levels;
@Override
public int compareTo(SkipListNode<T> other) {
return Double.compare(this.score, other.