已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最长不下降子序列的O(n*logn)算法分析如下:设 At表示序列中的第t个数,Ft表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F t = 0(t = 1, 2, ., len(A)。则有动态规划方程:Ft = max1, Fj + 1 (j = 1, 2, ., t - 1, 且Aj At)。 现在,我们仔细考虑计算Ft时的情况。假设有两个元素Ax和Ay,满足 (1)x y t (2)Ax Ay At (3)Fx = Fy 此时,选择Fx和选择Fy都可以得到同样的Ft值,那么,在最长上升子序列的这个位置中,应该选择Ax还是应该选择Ay呢? 很明显,选择Ax比选择Ay要好。因为由于条件(2),在Ax+1 . At-1这一段中,如果存在Az,Ax Az ay,则与选择Ay相比,将会得到更长的上升子序列。 再根据条件(3),我们会得到一个启示:根据F的值进行分类。对于F的每一个取值k,我们只需要保留满足Ft = k的所有At中的最小值。设Dk记录这个值,即Dk = minAt (Ft = k)。 注意到D的两个特点: (1)Dk的值是在整个计算过程中是单调不上升的。 (2)D的值是有序的,即D1 D2 D3 . Dlen,则将At接在Dlen后将得到一个更长的上升子序列,len = len + 1, Dlen = A t;否则,在D1.Dlen中,找到最大的j,满足Dj At。令k = j + 1,则有A t = Dk,将At接在Dj后将得到一个更长的上升子序列,更新Dk = At。最后,len即为所要求的最长上 升子序列的长度。 在 上述算法中,若使用朴素的顺序查找在D1.Dlen查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的 时间复杂度为O(n2),与原来的算法相比没有任何进步。但是由于D的特点(2),我们在D中查找时,可以使用二分查找高效地完成,则整个算法 的时间复杂度下降为O(nlogn),有了非常显著的提高。需要注意的是,D在算法结束后记录的并不是一个符合题意的最长上升子序列! #include using namespace std; int find(int *a,int len,int n)/若返回值为x,则ax=nax-1 int left=0,right=len,mid=(left+right)/2; while(leftamid) left=mid+1; else if(namid) right=mid-1; else return mid; mid=(left+right)/2; return left; void fill(int *a,int n) for(int i=0;in) fill(c,n+1); for(i=0;iai; c0=-1;/ 1 c1=a0;/ 2 b0=1;/ 3 for(i=1;in;i+)/ 4 j=find(c,n+1,ai);/ 5 cj=ai;/ 6 bi=j;/7 for(max=i=0;imax) max=bi; coutmaxcj=aicj-1,所以把cj的值更新为ai后,cj+1cjcj-1的性质仍然成 立,即c仍然是单调递增的; 2、循环中,c的值只在第6行发生变化,由cj=ai可知,cj更新为ai后,cj的值只会变 小不会变大,因为进入循环前cj的值是最小的,则循环中把cj更新为更小的ai,当 然此时cj的值仍是最小的; 3、循环中,bi的值在第7行发生了变化,因为有loop invariant的性质2,find函数返回值 为j有:cj-1ai=cj,这说明cj-1是小于ai的,且以cj-1结尾的递增子序列有最大的 长度,即为j-1,把ai接在cj-1后可得到以ai结尾的最长递增子序列,长度为(j-1)+1=j;termination: 循环完后,i=n-1,b0,b1,.,bn-1的值均已求出,即以a0,a1,.,an-1结尾的最长递 增子序列的长度均已求出,再通过第8行的循环,即求出了整个数组的最长递增子序列。 仔细分析上面的代码可以发现,每次循环结束后,假设已经求出c1,c2,c3,.,clen的值,则此时最长递增子序列的长度为len,因此可以把上面的代码更加简化,即可以不需要数组b来辅助存储,第8行的循环也可以省略。 #include using namespace std; int find(int *a,int len,int n)/修改后的二分查找,若返回值为x,则ax=n int left=0,right=len,mid=(left+right)/2; while(leftamid) left=mid+1; else if(nn) for(i=0;iai; b0=1; c0=-1; c1=a0; len=1;/此
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 醋酸装置操作工安全知识竞赛考核试卷含答案
- 淡水水生植物繁育工工作技能评优考核试卷含答案
- 盐酸生产工岗前质量控制考核试卷含答案
- 缝纫品整型工管理综合水平考核试卷含答案
- 2025-2026学年大班识字拼图说课稿
- 苯乙烯装置操作工技术管理强化考核试卷含答案
- 普通过磷酸钙生产工技术改进强化考核试卷含答案
- 半导体继电器装调工岗位班组协作考核试卷含答案
- 2025-2026学年关于colors英语说课稿
- 2026年放射性金属矿采选行业产业研究报告及未来五至十年政策驱动与市场机遇展望
- 家禽屠宰兽医卫生检验员考试题及答案2025新版
- 2026年幼儿园踢球公开课
- 2026青海省交通工程咨询有限公司校园引才总笔试历年参考题库附带答案详解
- 亚硝酸盐检测方法培训
- 【昭通】2025年云南昭通市市直事业单位公开选调工作人员42人笔试历年典型考题及考点剖析附带答案详解
- 牛场绩效考核制度
- 2025北京语言大学出版社有限公司招聘5人笔试历年典型考点题库附带答案详解3套试卷
- 《中小学跨学科课程开发规范》
- DZ/T 0156-1995区域地质及矿区地质图清绘规程
- 吉利汽车4S店运营手册
- 家庭年度盘点模板
评论
0/150
提交评论