77范文网 - 专业文章范例文档资料分享平台

0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题

来源:网络收集 时间:1970-01-01 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

问题描述

如果用有序链表来表示一个含有n个元素的有序集S,则在最坏情况下,搜索S中一个元素需要O(n)计算时间。提高有序链表效率的一个技巧是在有序链表的部分结点处增设附加指针以提高其搜索性能。在增设附加指针的有序链表中搜索一个元素时,可借助于附加指针跳过链表中若干结点,加快搜索速度。这种增加了向前附加指针的有序链表称为跳跃表。

应在跳跃表的哪些结点增加附加指针以及在该结点处应增加多少指针完全采用随机化方法来确定。这使得跳跃表可在O(logn)平均时间内支持关于有序集的搜索、插入和删除等运算。

例如:如图,(a)是一个没有附加指针的有序表,而图(b)在图(a)的基础上增加了跳跃一个节点的附加指针。图(c)在图(b)的基础上又增加了跳跃3个节点的附加指针。

在跳跃表中,如果一个节点有k+1个指针,则称此节点为一个k级节点。以图(c)中跳跃表为例,看如何在改跳跃表中搜索元素8。从该跳跃表的最高级,即第2级开始搜索。利用2级指针发现元素8位于节点7和19之间。此时在节点7处降至1级指针进行搜索,发现元素8位于节点7和13之间。最后,在节点7降至0级指针进行搜索,发现元素8位于节点7和11之间,从而知道元素8不在搜索的集合S中。

相关原理

在一般情况下,给定一个含有

n个元素的有序链表,可以将它改造

成一个完全跳跃表,使得每一个k级结点含有k+1个指针,分别跳过2^k-1,2^(k-1)-1,…,2^0-1个中间结点。第i个k级结点安排在跳跃表的位置i2^k处,i>=0。这样就可以在时间O(logn)内完成集合成员的搜索运算。在一个完全跳跃表中,最高级的结点是

级结点。

完全跳跃表与完全二叉搜索树的情形非常类似。它虽然可以有效地支持成员搜索运算,但不适应于集合动态变化的情况。集合元素的插入和删除运算会破坏完全跳跃表原有的平衡状态,影响后继元素搜索的效率。

为了在动态变化中维持跳跃表中附加指针的平衡性,必须使跳跃表中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,则应现在跳跃表中搜索其插入位置。经搜索发现应在节点7和11之间插入元素8.此时在节点7和11之间增加1个存储元素8的新节点,并以随机的方式确定新节点的级别。例如,如果元素

8是作为一个2级节点插入,则应对图中

虚线相交的指针进行调整,如果新插入的节点是一个1级节点,则只要修改2个指针,虚线相交的指针是有可能被修改的指针,这些指针可在搜索元素插入位置时动态地保存起来,以供插入时使用。

在一个完全跳跃表中,具有i级指针的结点中有一半同时具有i+1级指针。为了维持跳跃表的平衡性,可以事先确定一个实数0=p。由此产生新结点级别的过程可知,所产生的新结点的级别为0的概率为1-p,级别为1的概率为p(1-p),…,级别为i的概率为p^i(1-p)。如此产生的新结点的级别

有可能是一个很大的数,甚至远远超过表中元素的个数。为了避免这种情况,用

作为新结点级别的上界。其中n是当前跳跃表中结点个

数。当前跳跃表中任一结点的级别不超过 算法具体实现如下: 1、RandomNumber.h

[cpp] view plain copy

1. #include\ 2. //随机数类

3. const unsigned long maxshort = 65536L; 4. const unsigned long multiplier = 1194211693L; 5. const unsigned long adder = 12345L; 6.

7. class RandomNumber 8. {

9. private: 10. //当前种子

11. unsigned long randSeed; 12. public:

13. RandomNumber(unsigned long s = 0);//构造函数,默认值0表示由系统自动产生

种子

14. unsigned short Random(unsigned long n);//产生0:n-1之间的随机整数 15. double fRandom(void);//产生[0,1)之间的随机实数 16. }; 17.

18. RandomNumber::RandomNumber(unsigned long s)//产生种子 19. {

20. if(s == 0) 21. {

22. randSeed = time(0);//用系统时间产生种子 23. } 24. else 25. {

26. randSeed = s;//由用户提供种子 27. } 28. } 29.

30. unsigned short RandomNumber::Random(unsigned long n)//产生0:n-1之间的随机整

数 31. {

32. randSeed = multiplier * randSeed + adder;//线性同余式 33. return (unsigned short)((randSeed>>16)%n); 34. } 35.

36. double RandomNumber::fRandom(void)//产生[0,1)之间的随机实数 37. {

38. return Random(maxshort)/double(maxshort); 39. }

2、7d3d3.cpp

[cpp] view plain copy

1. //随机化算法 跳跃表 2. #include \ 3. #include \ 4. #include 5. #include 6. using namespace std; 7.

8. template class SkipList; 9. template 10. class SkipNode 11. {

12. friend SkipList; 13. private:

14. SkipNode(int size) 15. {

16. next = new SkipNode*[size]; 17. }

18. ~SkipNode() 19. {

20. delete []next; 21. }

22. EType data;//集合中的元素

23. SkipNode **next;//指针数组 next[i]是第i级指针 24. }; 25.

26. template 27. class SkipList 28. {

29. public:

30. SkipList(KType Large,int MaxE = 10000,float p = 0.5);

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题在线全文阅读。

0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/300227.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: