主元素、嵌套箱、四柱汉诺塔问题的算法设计与分析.pdf
《主元素、嵌套箱、四柱汉诺塔问题的算法设计与分析.pdf》由会员分享,可在线阅读,更多相关《主元素、嵌套箱、四柱汉诺塔问题的算法设计与分析.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 算法设计与分析 算法设计与分析 算法设计与分析 算法设计与分析 课程 课程 课程 课程大作业 大作业 大作业 大作业 题 题 题 题 目 目 目 目:主元素、嵌套箱、汉诺塔问题 作 作 作 作 者 者 者 者:天堂露珠(网名)邮 邮 邮 邮 箱 箱 箱 箱:完成时间 完成时间 完成时间 完成时间:2008-08-25 仅供学习参考 仅供学习参考 仅供学习参考 仅供学习参考 摘 摘 摘 摘 要 要 要 要 分析了主元素、嵌套 d 维箱与四柱汉诺塔问题。分别使用分治法、贪心法和动态规划的算法设计技术。使用伪代码实现描述了关键算法,同时也用 Java 语言实现了伪代码(源程序未附入文中)。关键字:
2、算法设计与分析,主元素,嵌套箱,汉诺塔 目 目 目 目 录 录 录 录 一、主元素问题1 基于分治法的线性时间求主元素算法1 无序关系时求主元素的 O(nlgn)的算法.2 无序关系时求主元素的 O(n)算法.4 算法测试.5 二、嵌套箱问题.6 箱嵌套关系的传递性.6 d 维箱的嵌套关系.6 最长嵌套箱序列8 三、四柱汉诺塔问题.11 四、参考文献.15-1-一 一 一 一、主元素问题 主元素问题 主元素问题 主元素问题 1、设 T0.n-1是 n 个元素的数组。对任一元素 x,设 S(x)=i|Ti=x。当|S(x)|n/2 时,称 x 为 T的主元素。1)如果 T中元素存在序关系,按分治
3、策略设计并实现一个线性时间算法,确定 T0.n-1是否有一个主元素。2)若 T中元素不存在序关系,只能测试任意两个元素是否相等,试设计并实现一个 O(nlogn)有效算法,确定 T是否有一个主元素。进一步,能找到一个线性时间算法吗?注:实现的算法要求列出足够的实验结果。1)基于分治法的线性时间求主元素算法 基于分治法的线性时间求主元素算法 基于分治法的线性时间求主元素算法 基于分治法的线性时间求主元素算法 算法思想 中位数:数列排序后位于最中间的那个数。如果一个数列有主元素,那么必然是其中位数。求一个数列有没有主元素,只要看中位数是不是主元素。找中位数的方法:选择一个元素作为划分起点,然后用快
4、速排序的方法将小于它的移动到左边,大于它的移动到右边。这样就将元素划分为两个部分。此时,划分元素所在位置为 k。如果 kn/2,那么继续用同样的方法在左边部分找;如果 k n/2 then print 主元素:+median+出现次数:+cnt else print 无主元素-2-找一个序列中第 k大的数伪代码 randomizedSelect(A,p,q,k):r randomizedPartition(p,q)找出划分元素 r if r=k then return Ar else if r k then randomizedSelect(A,p,r 1,k)else randomizedS
5、elect(A,r+1,q,k)-实现随机划分的伪代码:randomizedPartition(A,p,q):rand random(p,q)exchange Arand Aq return partition(p,q)-基于快速排序思想的划分伪代码:partition(A,p,q):pivot Aq i p 1 for j p to q 1 do if Aj=pivot then i i+1 exchange Ai Aj exchange Ai+1 Aq return i+1-时间复杂度分析 master()中求中位数可以在平均时间复杂度为 O(n)的时间内完成,检查中位数是否是主元素耗时
6、O(n),所以时间复杂度为 O(n)。2)2)2)2)无序关系时求主元素的 无序关系时求主元素的 无序关系时求主元素的 无序关系时求主元素的 O(nlgn)的算法 的算法 的算法 的算法 算法思想 若 T 中存在主元素,则将 T 分为两部分后,T 的主元素也必为两部分中至少一部分的主元素,因此可用分治法。将元素划分为两部分,递归地检查两部分有无主元素。算法如下:a.若 T 只含一个元素,则此元素就是主元素,返回此数。b.将 T 分为两部分 T1 和 T2(二者元素个数相等或只差一个),分别递归调用此方法求其主元素 m1 和 m2。c.若 m1 和 m2 都存在且相等,则这个数就是 T 的主元素
7、,返回-3-此数。d.若 m1 和 m2 都存在且不等,则分别检查这两个数是否为 T 的主元素,若有则返回此数,若无则返回空值。e.若 m1 和 m2 只有一个存在,则检查这个数是否为 T 的主元素,若是则返回此数,若否就返回空值。f.若 m1 和 m2 都不存在,则 T 无主元素,返回空值。算法实现 相应的 Java程序在 MasterElement.java中-O(nlgn)的算法伪代码:求 Tp.q中的主元素。返回主元素及其出现次数或空(表示无主元素)CheckMaster(T,p,q):if p q then return Tp and 1 len q p+1 r p+len/2 a
8、and numa CheckMaster(T,p,r 1)b and numb CheckMaster(T,r,q)if a=NIL and b=NIL then return NIL if a=NIL and b NIL then return CheckAnotherPart(T,len,p,r 1,b,numb)if a NIL and b=NIL then return CheckAnotherPart(T,len,r,q,a,numa)if a NIL and b NIL then if a=b then numa numa+numb return a and numa else r
9、e CheckAnotherPart(T,len,p,r 1,b,numb)if re NIL then return re else return CheckAnotherPart(T,len,r,q,a,numa)-检查候选主元素是否是主元素 CheckAnotherPart(T,len,p,q,c,numc):numc CheckNum(T,p,q,c)+numc if num len/2 then return c and numc else return NIL-4-计算 Tp.q中 element出现的次数 CheckNum(T,p,q,element):cnt 0 for i p
10、 to q do if Ti=element then cnt cnt+1 return cnt-时间复杂度分析 T(n)=2T(n/2)+n 所以时间复杂度为 O(nlgn)3)3)3)3)无序关系时求主元素的 无序关系时求主元素的 无序关系时求主元素的 无序关系时求主元素的 O(n)算法 算法 算法 算法 算法思想 在一个集合中,删除两个不同的数,则集合的主元素保持不变。根据这个原理,可以很快求出主元素。算法实现-相应的 Java程序在 MainElement.java中 master(A):n lengthA count 1 seed A0 找候选主元素 for i 1 to n 1 d
11、o if Ai=seed then count count+1 else if count 0 then count count 1 else seed Ai 查找候选主元素是否是主元素 count 0 for i 0 to n 1 do if Ai=seed then count count+1 if count n/2 then return seed and count else return NIL-5-时间复杂度分析 时间复杂度为 O(n)4)4)4)4)算法 算法 算法 算法测试 测试 测试 测试 对前面三个求主元素算法,使用测试数据进行测试:测试数组 结果 0,0,1,1,0,8
12、,1,1,1 主元素:1 出现次数:5 13,17,26,3,5,2,17,3 无主元素 1,2,3,4,5,6,7,8 无主元素 1,0,0,1,0,2,0 主元素:0 出现次数:4 1,3,4,1,2,1,1,4,0,1,1,1 主元素:1 出现次数:7 0,1,1 主元素:1 出现次数:2 13,17,26,3,5,2,17,3,3,3,3,3,3 主元素:3 出现次数:7 100,58 无主元素 597 主元素:597 出现次数:1 6,1,2,2,2,3,5 无主元素 7,7,7,7,7,7 主元素 7 出现次数:6 5,9,45,96,77,28,13 无主元素-6-二 二 二 二
13、、嵌套箱问题 嵌套箱问题 嵌套箱问题 嵌套箱问题 2、一个 d 维箱(x1,x2,.,xn)嵌入另一个 d 维箱(y1,y2,.,yn)是指存在1,2,d 的一个排列,使得x(1)y1,x(2)y2,.,x(d)yd。1)证明上述箱嵌套关系具有传递性;2)试设计并实现一个贪心算法,用于确定一个 d 维箱是否可嵌入另一个d维箱;3)给定由 n 个 d 维箱组成的集合 B1,B2,B3,.,Bn,试设计并实现一个贪心算法找出这n 个d维箱中的一个最长嵌套箱序列,并用n 和d 描述算法的计算时间复杂性。1)箱嵌套关系的传递性 箱嵌套关系的传递性 箱嵌套关系的传递性 箱嵌套关系的传递性 证明:设有 3
14、 个 d 维箱 B1(x1,x2,xd),B2(y1,y2,yd),B3(z1,z2,zd),B1可嵌入 B2,B2可嵌入 B3。B1可嵌入 B2,则存在排列使得:x(1)y1,x(2)y2,x(d)yd 1 B2可嵌入 B3,则存在排列使得:y(1)z1,y(2)z2,y(d)zd 2 由1式可得:x(1)y(1),x(2)y(2),x(d)y(d)3 由23可得:存在排列=使得:x(1)z1,x(2)z2,x(d)zd 根据 d 维箱的定义可得,B1可嵌入 B3。因此,嵌套箱关系具有传递性。2)d 维箱的嵌套关系 维箱的嵌套关系 维箱的嵌套关系 维箱的嵌套关系 贪心选择性质:对于d 维箱X
15、(x1,x2,xd),Y(y1,y2,yd),排列、是分别使 X、Y非递减有序的排列,有如下结论:XY(表示X 可嵌入Y)的充要条件是,对任意1id 有x(i)y(i)。证明:a.充分性:当对任意1id有x(i)y(i)时,令=-1,那么 x(i)=x(-1(i)y(-1(i)=yi,即存在一个排列使得对于任意1i-7-d,x(i)yi,所以XY。b.必要性:用数学归纳法证明。当维数为1 时,XY 可得 x1 y1,那么x(1)y(1)成立。假设维数为 d 时,结论成立,即:当XY 时,对于任意1id,有x(i)y(i)。那么当维数为 d+1 时,对于任意1id+1,XY,则存在 使得:x(1
16、)y1,x(2)y2,x(d)yd,x(d+1)yd+1 1 先观察1式前 d 项,x(1)y1,x(2)y2,x(d)yd。由假设可知,对任意1id,有存在排列、使得x(i)y(i),即:x(1)x(2)x(d)2 y(1)y(2)y(d)3 x(1)y(1),x(2)y(2),x(d)y(d)4 此时,、只对1式前 d 项进行排列,并不包含 x(d+1)和 yd+1。可以将 x(d+1)按大小顺序插入到2式(设插入位置为 j),从而有新的排列使得 xi(1id+1)非递减有序。同理,也有使得 yd+1按大小顺序插入到3式后(设插入位置为k),yi(1id+1)非递减有序。因为 x(d+1)
17、yd+1,易知 jk。当 j=k 时,因为xm、ym(1md+1)的对应位置都没有变,显然x(i)y(i)(1id+1),所证结论成立。当 jk 时,x1y1,x2y2,xjxj+1yj,xj+1xj+2 yj+1,xk-1xk yk-1,xkyk-1 yk,xk+1y k+1,xd+1 y d+1。即,对任意1id+1 x(i)y(i),所证结论成立。命题得证。算法实现 由上面所得结论,对两个 d维箱进行排序后,只要判断排序后两个 d 维箱的嵌套关系就可以得出结果。-求两个箱子的嵌套关系的伪代码:返回 1 表示 X嵌套 Y(即 YX)返回1 表示 Y嵌套 X(即 XY)返回 0 表示 X和
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 元素 嵌套 四柱汉诺塔 问题 算法 设计 分析
限制150内