大家好,问大家一个问题,关于跳跃表的

问题描述

跳跃表是怎么查找的,具体的过程是什么呢?请帮忙解释下,谢谢

解决方案

我就不贴图了,你可以看我的这篇文章跳跃表(Skip List)http://deepfuture.iteye.com/blog/954342
解决方案二:
跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找、插入、删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领。而且最重要的一点,就是它的编程复杂度较同类的AVL树,红黑树等要低得多,这使得其无论是在理解还是在推广性上,都有着十分明显的优势。 首先,我们来看一下跳跃表的结构 跳跃表由多条链构成(S0,S1,S2 ……,Sh),且满足如下三个条件:每条链必须包含两个特殊元素:+∞ 和 -∞(其实不需要)S0包含所有的元素,并且所有链中的元素按照升序排列。每条链中的元素集合必须包含于序数较小的链的元素集合。 操作 一、查找 目的:在跳跃表中查找一个元素x 在跳跃表中查找一个元素x,按照如下几个步骤进行: 1. 从最上层的链(Sh)的开头开始 2. 假设当前位置为p,它向右指向的节点为q(p与q不一定相邻),且q的值为y。将y与x作比较 (1) x=y 输出查询成功及相关信息 (2) x>y 从p向右移动到q的位置 (3) x<y 从p向下移动一格 3. 如果当前位置在最底层的链中(S0),且还要往下移动的话,则输出查询失败 二、插入 目的:向跳跃表中插入一个元素x 首先明确,向跳跃表中插入一个元素,相当于在表中插入一列从S0中某一位置出发向上的连续一段元素。有两个参数需要确定,即插入列的位置以及它的“高度”。 关于插入的位置,我们先利用跳跃表的查找功能,找到比x小的最大的数y。根据跳跃表中所有链均是递增序列的原则,x必然就插在y的后面。 而插入列的“高度”较前者来说显得更加重要,也更加难以确定。由于它的不确定性,使得不同的决策可能会导致截然不同的算法效率。为了使插入数据之后,保持该数据结构进行各种操作均为O(logn)复杂度的性质,我们引入随机化算法(Randomized Algorithms)。 我们定义一个随机决策模块,它的大致内容如下: 产生一个0到1的随机数r r ← random() 如果r小于一个常数p,则执行方案A, if r<p then do A 否则,执行方案B else do B 初始时列高为1。插入元素时,不停地执行随机决策模块。如果要求执行的是A操作,则将列的高度加1,并且继续反复执行随机决策模块。直到第i次,模块要求执行的是B操作,我们结束决策,并向跳跃表中插入一个高度为i的列。 我们来看一个例子: 假设当前我们要插入元素“40”,且在执行了随机决策模块后得到高度为4 步骤一:找到表中比40小的最大的数,确定插入位置 步骤二:插入高度为4的列,并维护跳跃表的结构 三、删除 目的:从跳跃表中删除一个元素x 删除操作分为以下三个步骤:在跳跃表中查找到这个元素的位置,如果未找到,则退出 将该元素所在整列从表中删除 将多余的“空链”删除 我们来看一下跳跃表的相关复杂度: 空间复杂度: O(n) (期望) 跳跃表高度: O(logn) (期望) 相关操作的时间复杂度: 查找: O(logn) (期望) 插入: O(logn) (期望) 删除: O(logn) (期望) 之所以在每一项后面都加一个“期望”,是因为跳跃表的复杂度分析是基于概率论的。有可能会产生最坏情况,不过这种概率极其微小。

时间: 2024-09-20 05:30:07

大家好,问大家一个问题,关于跳跃表的的相关文章

奇怪,为什么我问了一个ajax的一个问题,会被删除?

问题描述 奇怪,为什么我问了一个ajax的一个问题,会被删除? 是因为ajax的问题不能问,还是什么原因?难道是涉及一些法律问题,还是什么? 解决方案 一个奇怪的问题一个很奇怪的问题

chrome浏览器-问大伙一个关于js的问题

问题描述 问大伙一个关于js的问题 问大伙一个关于js的问题,这是我的一句html代码 <a href="/admin/beanType/delete?_id=${idValue}" onclick="return confirm('确定要删除这条记录吗')">删除</a> 执行结果是点击删除按钮会弹出确认框,点击确定或者取消,在IE和Firefox下都正常,但在chrome下却会执行该href而且使用调试工具看不到发起这个动作的请求,我很奇

【问】一个多用户文本编辑的数据挖掘问题,类似隐马尔科夫模型

问题描述 [问]一个多用户文本编辑的数据挖掘问题,类似隐马尔科夫模型 是一个多用户的文本编辑系统.对于一段文字的编辑,从最终的编辑结果来看,每个用户在编辑过程中的编辑位置是不确定的,有什么概率模型可以让我们大致模拟出每个新来的用户的编辑位置? 比如有一段已经编辑过的文本如下: 1166633355552222777744444(假设每个数字代表一个用户,数字的多少和位置代表用户编辑的多少和位置),然后现在有个新来的数字8用户,我们可以用怎样的模型来计算概率得出他最可能的编辑位置?

java-新手求问,一个运算问题

问题描述 新手求问,一个运算问题 public class Demo1 { public static void main(String[] args) { int a=123478; int b=0x68; int c=a&b; System.out.println(c); } } 输出结果是64,&不是且运算吗? 解决方案 因为&是按位与,不是逻辑与,就是你说的且.你的b是十六进制的,所以转成二进制是01101000,而你的a是十进制的,所以也需要转成二进制进行运算,转成二进制

c#-问大家一个关于sql server数据库的问题

问题描述 问大家一个关于sql server数据库的问题 我建的一个表中有一列"超期天数",我想对这一列执行计算,使其等于当前时间减去之前的一个时间.而且在用C#添加数据的时候,以及时间变化的时候,他的值会不断改变,这个该怎么弄?不知道我说的清楚么. 解决方案 不需要不断变化,只要你的程序查询的时候计算就可以了 http://blog.csdn.net/zhengqiqiqinqin/article/details/8451167 解决方案二: 有没有人来帮帮忙,非常感谢! 解决方案三

网站前台-问大家一个问题,大家遇到js有冲突的时候怎么解决

问题描述 问大家一个问题,大家遇到js有冲突的时候怎么解决 我用ssh做一个项目,由于前台设计不太会,所以从网上找了一些jquery的插件用,后来发现在有些页面显示不正常,这是不是js冲突了 解决方案 要是前端那么容易调 怎么还会有前端工程师这个职位呢 应该是一些小细节不对 JQuery 框架是可以兼容任何浏览器的 而且你说的js冲突这种bug不存在吧 同一种代码怎么会冲突呢 解决方案二: 解决一个js冲突问题 解决方案三: 不是,有可能是你浏览器的原因,有些函数的效果在不同的浏览器上效果不一样

参数-C 关于printf() 我真的很想问的一个问题!!!!

问题描述 C 关于printf() 我真的很想问的一个问题!!!! 编译器怎样检查 printf () 参数个数的? 刚刚学C 不久,不知道怎么找,于是到这里提问来了... 提前谢谢所有回答的人!!! thanks for your time . 解决方案 参考一下这个回答,对你应该有帮助 C中的可变参数研究 一. 何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和

游戏-刚刚接触directx不久,问大家一个关于directx加载纹理耗时和内存使用问题

问题描述 刚刚接触directx不久,问大家一个关于directx加载纹理耗时和内存使用问题 问大家一个关于使用directx开发2d游戏的问题,假如游戏中人物和怪使用的素材长宽都是512 32位的图片,人物包含头发.身体.和武器, 8方向行走64帧,攻击128帧,站立48帧 如果把一个人物所有的纹理都预先加载完需要使用的内存是 64MB+128MB+48MB=240MB如果是使用哪个加载哪个纹理,当前帧使用不到都清理掉那么卡帧很严重我这边测试平均创建一个纹理如果直接使用A8R8G8B8大概耗时

javascript-本人新手,求问大家一个最简单的,就是js跳个小窗口,然后填写内容,再注册到数据库里???

问题描述 本人新手,求问大家一个最简单的,就是js跳个小窗口,然后填写内容,再注册到数据库里??? 本人新手,求问大家一个最简单的,就是js跳个小窗口,然后填写内容,再注册到数据库里,用的是asp.net的. 就是说先设置div隐藏,然后再用js拿到div里的值,在codebehind里可以拿到这些值就行了,求教求教 解决方案 本人觉得你可以JS调用AJAX来访问数据库.使用JS从页面得到数据然后用AJAX把数据丢到后台.再后台把这些数据丢到数据库里面. 解决方案二: http://www.cn