分治算法简介及习题选讲.pptVIP

  • 9
  • 0
  • 约1.07万字
  • 约 46页
  • 2019-09-23 发布于湖北
  • 举报
例6:逆序对 给一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得ij且aiaj。n可以高达106。 方法一 枚举i,j判断a[i]a[j]是否成立。程序如下: ans:=0; for i:=1 to n-1 do for j:=i+1 to n do if a[i]a[j] then inc(ans); writeln(ans); 时间复杂度为O(n2),超时。 方法二 从大到小枚举i,再用树状数组维护ai+1到an中有多少个数小于ai。 时间复杂度O(nlgn)。 方法三 分治法。 f[i,j]表示a[i..j]中逆序对的个数。利用类似于归并排序的方法分以下三个步骤来做: 1.划分问题:从中间一分为二分成[i,(i+j)shr 1]和[(i+j)shr 1+1,j]两部分; 2.递归解决:递归求解f[i,(i+j)shr 1]和f[(i+j)shr 1+1,j]; 3.合并问题:f[i,j]=f[i,(i+j)shr 1]+f[(i+j)shr 1+1,j],除此之外,还要加上左数在区间[i,(i+j)shr 1]内而右数在区间[(i+j)shr 1+1,j]内的情况,可以在归并排序的合并操作中顺便进行,对于合并区域[L1,R1]和[L2,R2],当判断到左区域中的a[x](L1=x=R1)大于右区域中的a[y](L2=y=R

文档评论(0)

1亿VIP精品文档

相关文档