- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
0046算法笔记——【随机化算法】舍伍德随机化思想解决跳
跃表问题
0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃
表问题
问题描述
如果使用有序链表来表示包含n个元素的有序集s,在最坏的情况
下,在s中搜索元素需要O(n)个计算时间一种提高有序链表效率的技
术是在有序链表的一些节点上添加额外的指针,以提高其搜索性能。
当在具有附加指针的有序链表中搜索元素时,可以通过附加指针跳过
链表中的几个节点来加快搜索速度。这个带有前向附加指针的有序链
表被称为跳转表。
应该在跳转表的哪些节点添加额外的指针,以及应该在该节点添
加多少指针完全由随机化方法决定这使得跳转表能够支持诸如在平均
时间0(logn)内搜索、插入和删除有序集之类的操作例如,如图所示,
(a)是一个没有附加指针的有序表,而图(b)在图(a)的基础上增加了一个
附加指针来跳转一个节点图(c)在图(b)的顶部添加了额外的指针来跳转
3个节点
在跳转表中,如果一个节点有k+1个指针,它被称为k级节点以
图(c)中的跳转表为例,看看如何在修改后的跳转表中搜索元素8。搜
索从跳转表的最高级别开始,即级别2。使用2级指针发现元素8位于
节点7和19之间此时,在节点7处下降到级别1的指针被搜索,并且
发现元素8位于节点7和13之间最后,节的情况虽然它可以有效地支
持成员搜索操作,但它不适合集合中的动态变化。集合元素的插
入和删除会破坏完整跳转表的原始平衡状态,影响后续元素搜索
的效率。
为了在动态变化中保持跳转表中附加指针的平衡,跳转表中K级
节点的数量必须保持在点数总和的一定比例内。请注意,在完整的跳
转表中,50%的指针是0级指针;25%的指针是1级指针;…;(100/2
(k+1))%指针是k级指针因此,当插入元素时,以概率1/2引入0级节
点,以概率1/4引入1级节点,...并且以概率1/2(k+1)引入k级节点
另一方面,I级节点指向同一级别或更高级别的下一个节点,它跳过的
节点数不再精确地保持在2I-1在这种修改之后,当插入或删除一个元
素时,跳转表的平衡可以通过本地修改来维护。
跳转表中的节点级别在插入中确定,一旦确定就不会更改。下图
是遵循上述原则的跳转表示例。搜索它就像搜索一个完整的跳转表一
样如果要将元素8插入所示的跳转表中,现在应该在跳转表中搜索其
插入位置。在搜索之后,发现元素8应该被插入到节点7和11之间。
此时,在节点7和11之间添加新的节点存储元件8,并且以随机方式
确定新节点的级别。例如,如果元素
8作为2级节点插入,则图中虚线
所相交的指针应该被调整。如果新插入的节点是1级节点,则只
需要修改两个指针,虚线交叉的指针是可以修改的指针。当搜索插入
期间使用的元素的插入位置时,可以动态保存这些指针。
在一个完整的跳转表中,一半具有I级指针的节点同时具有i+1级
指针为了保持跳转表的平衡,可以预先确定一个实数016)%n;
34.}
35.
36.doublerandom::frandom(void)//生成随机实数37。{
38.returnrandom(maxshort)/double(maxshort);39.}
2,7d3d3。CPP
[CPP]视图普通副本
1。//随机化算法跳转表2。#包含包含3。#包含包含4。#包括5。#
include6.使用命名空间标准;7.
8。模板类SkipList9.模板10。SkipNode11类。{
12。朋友SkipList13.私人:
14。SkipNode(int大小)15。{
文档评论(0)