nlogn的最长上升子序列(pascal语言)

nlogn的最长上升子序列(pascal语言)

ID:8810850

大小:24.50 KB

页数:2页

时间:2018-04-08

nlogn的最长上升子序列(pascal语言)_第1页
nlogn的最长上升子序列(pascal语言)_第2页
资源描述:

《nlogn的最长上升子序列(pascal语言)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、B.最长不下降子序列的O(n*logn)算法分析如下:设A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F[t]=0(t=1,2,...,len(A))。则有动态规划方程:F[t]=max{1,F[j]+1}(j=1,2,...,t-1,且A[j]

2、样的F[t]值,那么,在最长上升子序列的这个位置中,应该选择A[x]还是应该选择A[y]呢?很明显,选择A[x]比选择A[y]要好。因为由于条件(2),在A[x+1]...A[t-1]这一段中,如果存在A[z],A[x]

3、到D[]的两个特点:(1) D[k]的值是在整个计算过程中是单调不上升的。(2) D[]的值是有序的,即D[1]D[len],则将A[t]接在D[len]后将得到一个更长的上升子序列,len=len+1,D[len]=A[t];否则,在D[1]..D[len]中,找到最大的j,满足D[j]

4、A[t]<=D[k],将A[t]接在D[j]后将得到一个更长的上升子序列,更新D[k]=A[t]。最后,len即为所要求的最长上升子序列的长度。在上述算法中,若使用朴素的顺序查找在D[1]..D[len]查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的时间复杂度为O(n^2),与原来的算法相比没有任何进步。但是由于D[]的特点(2),我们在D[]中查找时,可以使用二分查找高效地完成,则整个算法的时间复杂度下降为O(nlogn),有了非常显著的提高。需要注意的是,D[]在算

5、法结束后记录的并不是一个符合题意的最长上升子序列!varn,i,l,r,x,mid:longint;f:array[0..10000]oflongint;beginread(n);fori:=1tondobeginread(x);l:=1;r:=f[0];whilelxl:=mid+1elser:=mid;end;if(l>=r)and(x>f[f[0]]))then//若求最长下降子序列

6、则是xf[l]f[l]:=x;end;write(f[0]);end.引用Matrix67的话(求最长上升子序列):f表示长度为i的上升子序列最后一个数最小是多少。显然数组f是单增的。读到一个新的数x后,找到某个i使得x>f[i]且x<=f[i+1],于是用x去更新f[i+1];特别地,如果所有的f[i]都小于x,则增加f的长度。最后看f数组有多长

7、就行了。由于f单增,所以查找i时可以用二分查找,因此时间复杂度为O(nlogn)。举个例子,假如序列为328674573,则f数组的变化过程如下:32282626724724524572357最后,f的长度达到4,因此答案为4。注意,最后的f数组不一定是最长上升子序列的一个方案。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。