0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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级节点指向同一级别或更高级别的下一个节点,它跳过的节点数不再精确地保持在2 I-1在这种修改之后,当插入或删除一个元素时,跳转表的平衡可以通过本地修改来维护。
跳转表中的节点级别在插入中确定,一旦确定就不会更改。下图是遵循上述原则的跳转表示例。搜索它就像搜索一个完整的跳转表一样如果要将元素8插入所示的跳转表中,现在应该在跳转表中搜索其插入位置。在搜索之后,发现元素8应该被插入到节点7和11之间。此时,在节点7和11之间添加新的节点存储元件8,并且以随机方式确定新节点的级别。例如,如果元素
8作为2级节点插入,则图中虚线
所相交的指针应该被调整。如果新插入的节点是1级节点,则只需要修改两个指针,虚线交叉的指针是可以修改的指针。当搜索插入期间使用的元素的插入位置时,可以动态保存这些指针。
在一个完整的跳转表中,一半具有I级指针的节点同时具有i+1级
指针为了保持跳转表的平衡,可以预先确定一个实数016)% n;34.}
35.
36 . double random::f random(void)//生成随机实数37。{
38 . return random(max short)/double(max short);39.}
2,7d3d3。CPP
[CPP]视图普通副本
1。//随机化算法跳转表2。#包含\ 3。#包含\ 4。#包括5。# include 6 .使用命名空间标准;7.
8。模板类SkipList9.模板10。SkipNode 11类。{
12。朋友SkipList13.私人:
14。SkipNode(int大小)15。{
16。next =新Skipnode *[大小];17.}
18。~SkipNode() 19。{
20。删除[]下一步;21.}
22。EType数据;//元素
23。SkipNode * *集合中的下一个;//[下一个指针数组是一级指针24。};25.
26。模板27。SkipList 28级。{
29。公众:
30。SkipList(KType大,int MaxE = 10000,浮点p = 0.5);
31。~ Skiplist();
32。布尔搜索(常量KType 33。SkipList
34。SkipList 35。无效输出();36.私人:
37。int级别();
38。SkipNode *SaveSearch(常量KType 39。int MaxLevel//跳转表级别上限40。层间;//当前最大电平41。随机数rnd。//随机数发生器42。浮动Prob//用于分配节点级别43。KType TailKey//元素键值44的上限。SkipNode *头;//头节点指针45。SkipNode * NIL//尾部节点指针46。SkipNode * *最后一个;//指针数组47。};48.
49。//constructor
50 . template
51 . skip list::skip list(KTypLarge,intmaxe,floatp) 52。{
53 . prob = p;
54。MaxLevel =上限(log(float(MaxE))/log(1/p))-1;//初始化
界限
55。TailKey =在跳转表级别较大;//元素键值56的上限。级别= 0;//初始化当前最大值57。
58。//创建头尾节点和数组last
59 . head = news kipnode(max level+1);60.NIL =新SkipNode(0);61。last =新SkipNode *[最大级别+1];62.无->数据=大;63.
64。//将跳过表初始化为空表
65。对于(int I = 0;[i] =无;68.69岁。} 70。
71。//析构函数