`
zhangyu8374
  • 浏览: 94606 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本算法连载(6)-Skip List(上)

阅读更多
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];
}
}

}
分享到:
评论

相关推荐

    Algorithm-SkipList.zip

    跳过列表(Skip List)是一种数据结构,它在查找、插入和删除操作上具有与平衡二叉搜索树类似的性能,平均时间复杂度为O(log n),但实现起来更简单。跳过列表通过增加多级索引来加速查找过程,每层索引包含的数据比...

    算法初步课件 1.2.2 基本算法语句--条件语句.ppt

    算法初步课件 1.2.2 基本算法语句--条件语句.ppt

    wK算法算法处理RADARSAT-1数据_share

    **标题解析:** ...综上所述,这个项目涉及了遥感数据处理的高级技术,特别是对SAR数据的wK算法处理,以及使用Matlab进行编程实现。虽然核心代码未公开,但通过链接的文章可能能获取一些实施细节和成果展示。

    Bresenham画线算法、Cohen-SutherLand裁剪算法、de Casteljaus算法绘制贝赛尔曲线、扫描线填充算法、椭圆的扫描转换算法之C#实现

    首先,Bresenham画线算法是计算机图形学中最基本的算法之一,用于在像素化的屏幕上高效地绘制直线。该算法通过判断每个像素点应该属于哪一侧来决定是否填充,减少了浮点运算,提高了速度。它基于错误累积的概念,...

    用python实现skip-gram算法:AAAI-14 accepted papers(NLP)分类任务

    首先,我们需要理解skip-gram模型的基本架构。在skip-gram中,我们有两个主要的神经网络组件:输入层和输出层。输入层接收一个单词的one-hot编码作为输入,输出层则尝试预测上下文中的单词。这个过程通过反向传播...

    粒子群算法优化3-5-3多项式工业机器人时间最优轨迹规划算法matlab代码

    在机器人路径规划领域,优化算法起着至关重要的作用,它能帮助找到最有效、最经济的运动轨迹。本文将深入探讨“粒子群算法优化3-5-3多项式工业机器人时间最优轨迹规划算法”这一主题,以及如何在MATLAB环境下实现这...

    数据结构,算法与应用 ---C++语言描述(代码与习题答案)

    此外,C++标准库提供了丰富的容器(如vector、list、set、map)和算法(如sort、find、transform),简化了数据结构和算法的实现。 4. **代码与习题答案**:这部分内容包含对书中各种数据结构和算法的C++实现,以及...

    多目标遗传算法(NSGA-III)matlab源代码

    多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码 多目标遗传算法(NSGA-III)matlab源代码已验证

    py-skiplist:skiplist数据结构的纯python实现

    清单清单Python 跳过列表数据结构的纯python实现。 介绍 跳过列表是一种数据结构,可以用来代替平衡树。 跳过列表使用概率平衡而不是严格执行的平衡,因此,与等效树平衡算法相比...'skiplist({"foo": "bar", "spam":

    AC算法和AC-BM算法

    6. `acbm`:这个文件可能是AC-BM算法的源代码或者一个可执行程序。 理解并实现这些算法,不仅能够提升字符串匹配的效率,还能帮助开发者深入理解计算机科学中的搜索算法和数据结构。对于研究和实践文本处理、信息...

    数据结构与算法分析--C语言描述_数据结构与算法_

    此PDF教材可能涵盖这些基本概念,并通过实例代码展示C语言中如何实现这些数据结构和算法。学习者不仅可以了解理论知识,还能动手实践,提升编程能力。通过学习,读者应能理解各种数据结构的特点和适用场景,掌握常见...

    空间谱估计理论与算法------程序.rar

    第6章_旋转不变子空间算法;第7章_子空间迭代与更新;第8章_宽带信号的空间谱估计算法;第10章 空间分布式信号源参数估计;第11章_特殊阵列结构的空间谱估计;第12章_基于高阶统计量的空间谱估计;第13章_空间谱估计...

    UWB常用测距算法(CHAN、CHAN-Taylor等)

    该算法的基本思想是通过测量信号从一个发射器到多个接收器的时间差来计算目标的距离。其主要步骤如下: 1. **信号同步**:首先,接收端需与发射端进行时钟同步,确保时间基准一致。 2. **TDOA估计**:记录下信号...

    NSGA-III算法-matlab版本-写满了中文注释

    这是从mathwork上下载的NSGA-3的代码,自己写的注释。因为也没有完全弄懂代码,所以有些地方空着没写注释,有些地方还注释了问号。就是希望能和大家一起讨论交流一下,希望大家指正。希望弄懂代码的小伙伴能回帖说...

    梁友栋-barsky算法

    用梁友栋-barsky算法或者中点分割法等其它算法(除cohen-sutherland直线裁剪算法外)实现直线段相对于给定窗口的裁剪。 采用C/C++ 、OpenGL编写程序(参考所提供的程序代码clip.cpp及第一次实验提供的建立Project的...

    ECC算法校验工具---ECC开发

    ECC算法校验工具ECC算法校验工具ECC算法校验工具

    CBOW和skip-gram词向量模型的Python实现,以及分层softmax和负采样学习算法

    它的基本思想是:给定一个词的上下文窗口,预测该词。在训练过程中,CBOW会将窗口内的所有词的向量加权平均作为输入,然后通过一个神经网络层预测目标词的向量。在Python中,可以使用如gensim库来实现CBOW模型。 **...

    算法技术手册 - 中文版

    《算法技术手册》内容简介:开发健壮的软件需要高效的算法,然后程序员们往往直至问题发生之时,才会去求助于算法。《算法技术手册》讲解了许多现有的算法,可用于解决各种问题。通过阅读它,可以使您学会如何选择和...

    GA-PSO混合算法的matlab源码

    本资源提供的"GA-PSO混合算法的matlab源码"是一个结合了遗传算法(Genetic Algorithm, GA)与粒子群优化算法(Particle Swarm Optimization, PSO)的混合方法,专门应用于解决WSNs的路由优化问题。这两种算法都是...

    《数据结构算法与应用-c++语言描述》

    通过学习《数据结构算法与应用-C++语言描述》,读者不仅能掌握数据结构的基本概念,还能了解到如何在C++环境中实现这些结构,并通过实例了解它们在实际编程中的应用。书中可能还包含习题和解决方案,帮助读者巩固...

Global site tag (gtag.js) - Google Analytics