分治算法举例(共4页)_第1页
分治算法举例(共4页)_第2页
分治算法举例(共4页)_第3页
分治算法举例(共4页)_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上1 设X0:n-1和Y0:n-1为两个数组,每个数组中含有n个已排序好的数。试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数,并证明算法的时间复杂性为O(logn)。注:个数为奇数,则处于最中间位置的数;个数为偶数,则中间两个数据的平均数。解:利用二分查找思想:对于两个等长的数组,如果数组长度为奇数,令mid为数组的最中间元素的位置,则有Xmid,Ymid分别为两个数组的中位数,则存在以下情况:(1)如果Xmid<Ymid,则两个数组合并后的中位数应该在Xmid : n-1和Y0 : mid中查找;(2)如果Xmid>Ymid,则两个数

2、组合并后的中位数应该在X0 : mid和Ymid : n-1中查找;(3)如果Xmid=Ymid,则两个数组合并后的中位数就是Xmid或者Ymid另外考虑特殊情况:如果两个数组的长度为1,则无需比较大小,合并后数组的中位数即为两个数组元素的平均值。如果数组的长度为偶数,令mid为数组的中间两个元素的较小元素的位置,此时数组X的中位数为x=(Xmid+Xmid+1)/2.0,数组Y的中位数为y=(Ymid+Ymid+1)/2.0 (这里考虑到中位数不一定为整数)。则存在以下情况:(1)如果x<y,则两个数组合并后的中位数应该在Xmid+1 : n-1和Y0 : mid中查找;(2)如果x&

3、gt;y,则两个数组合并后的中位数应该在X0 : mid和Ymid+1 : n-1中查找;(3)如果x=y,则两个数组合并后的中位数就是x或者y.考虑特殊情况:如果两个数组的长度为2,则如果其中一个数组A的元素刚好处于合并后的数组的中间位置,则最终的中位数为这个数组A的数组元素的平均数。否则,则回到数组长度为偶数的一般情况。具体如下:double Search_Median(int *A,int l1,int r1,int *B,int l2,int r2,int n)/*如果两个数组的长度为,则中位数为所有元素的平均数,其中A,B为要查中位数的数组,l1,r1,l2,r2分别为两个数组每次查

4、询的起始位置和终点位置n为两个数组每次查询时的范围(重新查询的数组长度)*/if (n=1) /数组长度为1的情况return (Al1+Bl2)/2.0;if (n=2) /数组长度为2的情况if (Al1>Bl1&&Ar1<Br2)return (Al1+Ar1)/2.0;else if (Al1<Bl1&&Ar1>Br2)return (Bl2+Br2)/2.0;else;/这里使用mid1,mid2分别来记录两个数组每次变化后的中间位置int mid1=(r1+l1)/2;int mid2=(r2+l2)/2;/如果数组的长度为偶

5、数,对数组进行查询if(n%2=0)/这里考虑到偶数数组的中位数是中间两个数的平均数double x=(Amid1+Amid1+1)/2.0;double y=(Bmid2+Bmid2+1)/2.0;if (x<y)return Search_Median(A,mid1+1,r1,B,l2,mid2,n/2);else if(x=y) return x;elsereturn Search_Median(A,l1,mid1,B,mid2+1,r2,n/2);/如果数组长度为奇数,对数组查询if(n%2=1)if (Amid1=Bmid2)return Amid1;else if (Amid

6、1<Bmid2)return Search_Median(A,mid1,r1,B,l2,mid2,n/2+1);elsereturn Search_Median(A,l1,mid1,B,mid2,r2,n/2+1);这样一来,因为采用的是二分查找的思想,数组又是已经排好序的,因此每次查找两个数组的中位数的时间复杂度为O(1),比较的代价为O(1),而查找过程总得需要重复logn次,因此算法的时间复杂度为O(logn)。2 有一实数序列a1,a2,aN, 若 i<j 且ai>aj, 则(ai , aj)构成了一个逆序对,请使用分治方法求整个序列中逆序对个数,并分析算法的时间复杂

7、性。例如:序列(4, 3, 2)逆序对有(4, 3),(4, 2),(3, 2)共3个解:数据输入:a数组,n(元素个数)采用归并排序思想:将序列看成一个数组假设f(i , j)为i到j的逆序对个数,取一个分割点k,假设s(i , j , k)表示以k为分割点,第一个元素在i到k中,第二个元素在k+1到j中形成的逆序对数。那么可以形成一个递归式:f(i , j)=f(i , k) + f(k+1 , j) + s(i , j , k).采用归并排序算法进行递归求解,如果对于A数组的i到k和k+1到j 两个部分皆为有序的情况,那么对于当aj<ai时,必然有aj<ai.k,即aj和从i

8、到k号元素都形成逆序对,此时只要将s(i,j,k)加上k-i+1(i到k之间的元素个数)就可以了,此过程类似于归并排序的合并过程。则可以据此得到相应算法。首先设置一个计数器记录逆序对个数,每次归并分成分割与合并两部分,在合并部分中过程中添加计数过程,具体如下:static int count=0; /定义一个计数器,记录逆序对个数void merge(int a,int p,int q,int r)/合并过程,其中a为原数组,p为数组的起始位置,q为分割位置,r为元素个数int n1=q-p+1;int n2=r-q; /定义两个新数组存放数组a中的元素int * l=new intn1+1;

9、 int * rl=new intn2+1; for(int i=0;i<n1;i+) li=ap+i-1; for(int j=0;j<n2;j+) rlj=aq+j; ln1=65535; /将新数组的最后一个位置设为无限大作为哨兵rln2=65535; int i=0; int j=0; /合并两个数组到原数组for(int k=p-1;k<r;k+) if(li<=rlj) ak=li;i+; else ak=rlj; j+; count+=(q-i+1-p);/存在逆序对,将逆序对数进行记录 void mergeSort(int a,int p,int r) /分割过程,r为元素个数if(p<r) int q=(p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论