Skip List号称性能与BST(Binary Sort Tree)树有得一拼,于是把它翻了个底朝天。代码是阐述其思想的最好方式,那我们还是看看它的具体实现(采用Java语言)
public class SkipList {
public static final int NOT_FOUND = -1;
public static final int HEADER_KEY = -2;
public static final int NIL_KEY = Integer.MAX_VALUE;
// optimum probability
public static final float OPT_PROB = 0.25f;
private float myProbability;
// probability to increase level
private int myMaxLevel;
// upper bound of levels
private int myLevel;
// greatest level so far
private SkipListElement
myHeader; // the header element of list
/*
* Constructs a new skip list optimized for the given
* expected upper bound for the number of nodes.
*/
public SkipList(long maxNodes) {
// probability set to 0.25 and maximum level
// of list is depending on expected number of nodes
// (see paper for mathematical background)
this(OPT_PROB,(int)Math.ceil(Math.log(maxNodes)/Math.log(1/OPT_PROB))-1);
}
public SkipList(float probability, int maxLevel) {
myLevel = 0;
myProbability = probability;
myMaxLevel = maxLevel;
// generate the header of the list
myHeader = new SkipListElement(myMaxLevel,HEADER_KEY, 0);
// append the "NIL" element to the header
SkipListElement nilElement = new SkipListElement(myMaxLevel, NIL_KEY, 0);
for (int i=0; i<=myMaxLevel; i++) {
myHeader.forward[i] = nilElement;
}
}
/*
* Generates with help of randomizer the level of a new element.
* The higher a level, the less probable it is (see paper).
* Levels begin at 0 (not at 1 like in the paper).
*/
private int generateRandomLevel() {
int newLevel = 0;
while (newLevel<myMaxLevel &&Math.random()<myProbability ) {
newLevel++;
}
return newLevel;
}
/*
* Inserts a new node into the list.
* If the key already exists, its node is updated to the new value.
*/
public void insert(int searchKey, int value) {
// update pointers to next elements on each level and
// levels run from 0 up to myMaxLevel.
SkipListElement[] update = new SkipListElement[myMaxLevel+1];
// init "cursor" element to header
SkipListElement element = myHeader;
// find place to insert the new node
for (int i=myLevel; i>=0; i--) {
while (element.forward[i].key <searchKey) {
element = element.forward[i];
}
update[i] = element;
}
element = element.forward[0];
// element with same key is overwritten
if (element.key == searchKey) {
element.value = value;
}else{
// or an additional element is inserted
int newLevel = generateRandomLevel();
// element has biggest level seen in this list,update list
if (newLevel > myLevel) {
for (int i=myLevel+1;i<=newLevel; i++) {
update[i] = myHeader;
}
myLevel = newLevel;
}
// allocate new element:
element = new SkipListElement(newLevel,searchKey, value);
for (int i=0; i<=newLevel; i++) {
element.forward[i] = update[i].forward[i];
update[i].forward[i] = element;
}
}
}
/*
* Search for a given key in list. You get the value associated
* with that key or the NOT_FOUND constant.
*/
public int search(int searchKey) {
// init "cursor"-element to header
SkipListElement element = myHeader;
// find element in list:
for (int i=myLevel; i>=0; i--) {
SkipListElement nextElement = element.forward[i];
while (nextElement.key < searchKey) {
element = nextElement;
nextElement = element.forward[i];
}
}
element = element.forward[0];
if (element.key == searchKey) {
return element.value;
}else {
return NOT_FOUND;
}
}
public void delete(int searchKey) {
// update holds pointers to next elements of each level
SkipListElement update[] = new SkipListElement[myMaxLevel+1];
// init "cursor"-element to header
SkipListElement element = myHeader;
// find element in list
for (int i=myLevel; i>=0; i--) {
SkipListElement nextElement = element.forward[i];
while (nextElement.key < searchKey) {
element = nextElement;
nextElement = element.forward[i];
}
update[i] = element;
}
element = element.forward[0];
// element found, so rebuild list without node
if (element.key == searchKey) {
for (int i=0; i<=myLevel; i++) {
if (update[i].forward[i] == element) {
update[i].forward[i] = element.forward[i];
}
}
// element can be freed now
element = null;
// maybe we have to downcorrect the level of the list
while (myLevel>0&& myHeader.forward[myLevel].key==NIL_KEY){
myLevel--;
}
}
}
/*
* inner class
*/
private class SkipListElement {
int key;
int value;
int level;
// array of forward pointers
SkipListElement forward[];
public SkipListElement(int level, int key, int value) {
this.key = key;
this.value = value;
this.level = level;
forward = new SkipListElement[this.level+1];
}
}
}
分享到:
相关推荐
基本算法---计数.sb3
算法初步课件 1.2.2 基本算法语句--条件语句.ppt
**标题解析:** ...综上所述,这个项目涉及了遥感数据处理的高级技术,特别是对SAR数据的wK算法处理,以及使用Matlab进行编程实现。虽然核心代码未公开,但通过链接的文章可能能获取一些实施细节和成果展示。
首先,我们需要理解skip-gram模型的基本架构。在skip-gram中,我们有两个主要的神经网络组件:输入层和输出层。输入层接收一个单词的one-hot编码作为输入,输出层则尝试预测上下文中的单词。这个过程通过反向传播...
在机器人路径规划领域,优化算法起着至关重要的作用,它能帮助找到最有效、最经济的运动轨迹。本文将深入探讨“粒子群算法优化3-5-3多项式工业机器人时间最优轨迹规划算法”这一主题,以及如何在MATLAB环境下实现这...
一个介绍遗传算法的PPT-基本遗传算法.ppt 附件是一个介绍遗传算法的ppt,我觉得还是很不错的,希望对大家特别是那些初学遗传算法的朋友有一定帮助。 基本遗传算法.ppt === ...
MIMO预编码算法MATLAB实现-ZF、MMSE、SVD、BD
多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码已验证
清单清单Python 跳过列表数据结构的纯python实现。 介绍 跳过列表是一种数据结构,可以用来代替平衡树。 跳过列表使用概率平衡而不是严格执行的平衡,因此,与等效树平衡算法相比...'skiplist({"foo": "bar", "spam":
算法可视化--数据结构课程设计。目前支持了其中基本排序算法以及迪杰斯特拉算法可视化,欢迎学弟学妹Fo_algorithmVisualize
神经网络算法的基本介绍,其中也说明了神经网络算法与网格计算的区别
6. `acbm`:这个文件可能是AC-BM算法的源代码或者一个可执行程序。 理解并实现这些算法,不仅能够提升字符串匹配的效率,还能帮助开发者深入理解计算机科学中的搜索算法和数据结构。对于研究和实践文本处理、信息...
此PDF教材可能涵盖这些基本概念,并通过实例代码展示C语言中如何实现这些数据结构和算法。学习者不仅可以了解理论知识,还能动手实践,提升编程能力。通过学习,读者应能理解各种数据结构的特点和适用场景,掌握常见...
第6章_旋转不变子空间算法;第7章_子空间迭代与更新;第8章_宽带信号的空间谱估计算法;第10章 空间分布式信号源参数估计;第11章_特殊阵列结构的空间谱估计;第12章_基于高阶统计量的空间谱估计;第13章_空间谱估计...
该算法的基本思想是通过测量信号从一个发射器到多个接收器的时间差来计算目标的距离。其主要步骤如下: 1. **信号同步**:首先,接收端需与发射端进行时钟同步,确保时间基准一致。 2. **TDOA估计**:记录下信号...
根据提供的文件信息,我们可以归纳出以下关键的数据结构与算法知识点: ...综上所述,以上函数覆盖了顺序表的基本操作,包括插入、删除、查找、打印和反转等。这些操作是理解和使用顺序表这一基本数据结构的关键所在。
Matlab作为强大的数学和工程计算工具,为实现S型加减速算法提供了便利的平台。 S型加减速曲线,也称为三次多项式曲线,其形状类似于字母"S",由加速阶段、匀速阶段和减速阶段组成。这种曲线在启动时缓慢加速,达到...
其基本思想如下,假设边缘节点的 K-shell值为 1,然后往内一层层进入网络的核心,先去除网络 中度值等于 1 的所有节点以及连边。 若剩下的节点里面,仍有度值等于 1 的节点,则重复上述操作,即去除这些节点和连边...
ECC算法校验工具ECC算法校验工具ECC算法校验工具