NOIP基础算法综合---分治与贪心.ppt
《NOIP基础算法综合---分治与贪心.ppt》由会员分享,可在线阅读,更多相关《NOIP基础算法综合---分治与贪心.ppt(83页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四部分第四部分 分治策略分治策略一、分治思想一、分治思想 分治法,又叫分治策略,顾名思义,分而治之。分而治之。 它的基本思想为:对于难以直接解决的规模较大的问题,把它分解成若干个能直接解决的相互独立的子问题,递归求出各子问题的解,再合并子问题的解,得到原问题的解。 通过减少问题的规模,逐步求解,能够明显降低解决问题的复杂度。 二、分治法的适用条件二、分治法的适用条件 能使用分治法解决的问题,它们一般具备以下几个特征: 该问题可以分解成若干相互独立、规模较小的相同子问题; 子问题缩小到一定的程度能轻易得到解; 子问题的解合并后,能得到原问题的解; 分治法在信息学竞赛中应用非常广泛,使用分治策略
2、能生成一些常用的算法和数据结构,如快排、最优二叉树、线段树等;还可以直接使用分治策略,解决一些规模很大、无法直接下手的问题。三、分治的三步骤三、分治的三步骤 分解:分解:将要解决的问题分解成若干个规模较小的同类子问题; 解决:当解决:当子问题划分得足够小时,求解出子问题的解。 合并:合并:将子问题的解逐层合并成原问题的解。分治算法设计过程图分治算法设计过程图 由分治法所得到的子问题与原问题具有相同的类型。如果得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出不用进一步细分就可求解的子问题。分治求解可用一个递归过程来表示。 要使分治算法效率高,关键在于
3、如何分割?一般地,出于一种平衡原则,总是把大问题分成K个规模尽可能相等的子问题,但也有例外,如求表的最大最小元问题的算法,当n6时,等分定量成两个规模为3的子表L1和L2不是最佳分割。一般来讲,都是2分为主。四、分治的框架结构四、分治的框架结构if(问题不可分问题不可分) 直接求解;直接求解; 返回问题的解;返回问题的解;else 对原问题进行分治;对原问题进行分治; 递归对每一个分治的部分求解递归对每一个分治的部分求解; 归并整个问题,得出全问题的解;归并整个问题,得出全问题的解; 例题例题1 1:给:给n n个实数,求它们之中最大值和最小值,要求个实数,求它们之中最大值和最小值,要求比较次
4、数尽量小。比较次数尽量小。分析:分析:假设数据个数为n,存放在数组a1.n中。可以直接进行比较: minn=a1;maxx=a1; for(i=2;imaxx)maxx=ai; else if(aixr1)maxx=xr2;minn=xr1; else maxx=xr1;minn=xr2; else d=(r1+r2)/2; pd(r1,d,max1,min1); pd(d+1,r2,max2,min2); if(max1max2)maxx=max1;else maxx=max2; if(min1min2)minn=min1;else minn=min2; 【思考试题思考试题】最大值最小化最大
5、值最小化 【问题描述问题描述】把一个包含n个正整数的序列划分成m个连续的子序列(每个正整数恰好属于一个序列)。设第i个序列的各数之和为S(i),你的任务是让所有的S(i)的最大值尽量小。例如序列1 2 3 2 5 4划分成3个序列的最优方案为1 2 3|2 5|4,其中S(1)=6,S(2)=7,S(3)=4,最大值为7;如果划分成1 2|3 2|5 4,则最大值为9;不如刚才的好。n=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后4位。【文件输入文件输入】输入仅一行,有四个数,依次为a、b、c、d【文件输出文件输出】输出也只有一行,即三个根(从小到大输出)
6、【样例输入样例输入】1 -5 -4 20【样例输入样例输入】-2.00 2.00 5.00 如果精确到小数点后两位,可用简单枚举法:将x从-100.00 到100.00(步长0.01)逐一枚举,得到20000个 f(x),取其值与0最接近的三个f(x),对应的x即为答案。而题目已改成精度为小数点后4位,枚举算法时间复杂度将达不到要求。 直接使用求根公式,极为复杂。加上本题的提示给我们以启迪:采用二分法逐渐缩小根的范围,从而得到根的某精度的数值A.A.当已知区间当已知区间(a,b)(a,b)内有一个根时;内有一个根时; 用二分法求根,若区间(a,b)内有根,则必有f(a)*f(b)b或f(a+b
7、)/2)=0,则可确定根为(a+b)/2并退出过程; (2).若f(a)*f(a+b)/2)0,则必然有f(a+b)/2)*f(b)=1。因此可知:在-100,-99、-99,-98、99,100、100,100这201个区间内,每个区间内至多只能有一个根。即:除区间100,100外,其余区间a,a+1,只有当f(a)=0或f(a)f(a+1)0时,方程在此区间内才有解。若f(a)=0 ,解即为a;若f(a)f(a+1)0 ,则可以利用A中所述的二分法迅速出找出解。如此可求出方程的所有的解。void divide(double x1,double x2) double x0,y0,y1,y2;
8、 x0=(x1+x2)/2; y1=cal(x1);y2=cal(x2);y0=cal(x0); if(x2-x10.00001&y1*y20) printf(%.4f ,(x2+x1)/2);return; if(y1*y01) divide(x1,x0); if(y0*y21) divide(x0,x2); 归并排序的基本思想:归并排序的基本思想:归并排序充分应用分治算法的策略,将n个数分成n个单独的有序数列,每个数列中仅有一个数字;再将相邻的两列数据合并成一个有序数列,每个数列中有2个数;再重复上面的合并操作,直到合成一个有序数列。按照分治三步法来说, 归并过程归并过程为: (1 1)划
9、分:)划分:把序列分成元素个数相等的两半; (2 2)递归求解:)递归求解:把两半分别排序; (3 3)合并:)合并:把两个有序表合成一个;分析分析 显然,前两部分是很容易完成的,关键在于如何把两个有关键在于如何把两个有序表合成一个序表合成一个。每次只需要把两个序列中当前的最小元素加以比较,删除较小元素并加入合并后的新表。int tempmaxn; /辅助空间辅助空间void MergeSort(int left,int right)/对区间对区间left-right进行归并排序进行归并排序 if(left= =right)return; /只有一个元素只有一个元素 mid=(left+rig
10、ht)/2; /找中间位找中间位 MergeSort(left,mid); /对左边归并对左边归并 MergeSort(mid+1,right); /对右边归并对右边归并 i=left,j=mid+1,p=left; /合并左右合并左右 while(i=mid&jaj) tempp+=aj+; else tempp+=ai+; while(i=mid)tempp+=ai+; while(j=right)tempp+=aj+; for(i=left;i=right;i+)ai=tempi; 【变形变形1 1】逆序对数目逆序对数目 例题:求例题:求“逆序对逆序对”。 给定一整数数组A=(A1,A2
11、,An), 若iAj,则就为一个逆序对。例如数组(3,1,4,5,2)的逆序对有,。问题是,输入n和A数组,统计逆序对数目。 数据范围:1=naj then c:=c+1; 时间复杂度为O(n2)采用二分法求解采用二分法求解:记数列记数列ast,ed的逆序对数目为的逆序对数目为D(st,ed); mid=(st+ed)/2,则有:则有: D(st,ed)=D(st,mid)+D(mid+1,ed)+F(st.mid,ed). 其中其中F(st,mid,ed)表示一个数取自表示一个数取自Ast,mid,令一个数令一个数取自取自Amid+1,ed的逆序对数目。的逆序对数目。 和归并排序一样,划分和
12、递归求解都好办,关键在于合并:如何求出i在左边,而j在右边的逆序对数目呢?统计的常见技巧是“分类”。我们按照j的不同把这些“跨越两边”的逆序对进行分类:只要对于右边的每个j,统计左边比它大的元素个数f(j),则所有f(j)之和便是答案。 幸运的是,归并排序可以帮助我们“顺便”完成f(j)的计算:由于合并操作是从小到大进行排序的,当右边的aj复制到T中时,左边还没有来得及复制到T的那些数就是左边所有比aj大的数。此时累加器中加上左边元素个数mid-i+1即可。 即把即把“if(aiaj) tempp+=aj+;”if(aiaj) tempp+=aj+;” 改为改为“if(aiaj)if(aiaj
13、)tot=tot+mid-tot=tot+mid-i+1;i+1;tempp+=aj+; ”tempp+=aj+; ”。 【问题描述问题描述】给出从小到大排列的n个不同数a0an-1,试判断元素x是否出现在表中。 方法方法1 1:顺序查找:顺序查找:方法是一个个寻找,时间复杂度为O(n)。这个方法并没有用到“n个数从小到大排列”这一个关键条件,因而时间效率低下。 只需要比较log2n个元素。假设需要在aLar中查找元素x。 划分:划分:检查某个元素am(L=mx,那么元素只可能在aLam-1中;如果amr)return -1; int m=(L+r)/2; if(am= x)return m;
14、 else if (amx) return bsearch(L,m-1,x); else return bsearch(m+1,r,x); int bsearch(int L,int r,int x) int m; while(Lx) r=m1;else L=m+1; return -1; /查找不成功查找不成功【扩展扩展1】二分查找求下界,即第一次出现的位置二分查找求下界,即第一次出现的位置 int Erfen(int L,int r,int x) int mid; while(Lr) mid=(L+r)/2; if(x=amid)r=mid; else L=mid+1; return L;
15、 【扩展扩展2】二分查找求上界,即最后一次出现位置的后一个二分查找求上界,即最后一次出现位置的后一个位置位置【思考题目思考题目】给出n个整数和m个询问,对于每个询问(a,b),输出闭区间a,b内的整数c的个数。【思路点拨思路点拨】 先把所有的数据从小到大排序; 二分查找求下界,即第一次出现的位置low; 二分查找求上界,即最后一次出现位置的后一个位置high; 答案区间为:ans=high-low【变形变形1 1】查找等值点查找等值点 【问题描述问题描述】n个不同整数从小到大排序后放在数组A0An-1中,是否存在i,使得Ai=i?若存在,试找到此点。 【问题描述问题描述】计算计算a an n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 基础 算法 综合 分治 贪心
限制150内