算法第二章作业

一。

分治法的思想体会。

分治法的设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

    凡治众如治寡,分数是也。——孙子兵法

 

1.基本思想

 

(1) 将求解的较大规模的问题分割成k个更小规模的子问题。

 

 

(2) 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。

 

 

 (3) 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

 

 

2.适用条件
分治法所能解决的问题一般具有以下几个特征:
I. 该问题的规模缩小到一定的程度就可以容易地解决;
II. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
III. 利用该问题分解出的子问题的解可以合并为该问题的解;
IV. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
 
 

3. 分治法的应用例子

(1)快速排序  

                这里不详细讲 主要概括为 分解—>递归求解—>合并   三个步骤

(2)二分法

              在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。

              时间复杂度:O (logn),优于直接顺序查找O(n)

             二分法常用模板:

 1 //x:待查找的元素, n:数组集合大小, num数组单调递增
 2 
 3 int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上节
 4 
 5 while(low<=high)                     
 6 
 7 {
 8 
 9     mid=(low+high)/2; //mid:将集合分割为两部分
10 
11     if(num[mid]==x) //查找到符合元素x
12 
13     {
14 
15         res = mid;
16 
17         break;               
18 
19     }        
20 
21     else if(num[mid]<x)//x在右边部分,调整集合下界
22 
23         low=mid+1;
24 
25     else //x在左边部分,调整集合上界
26 
27         high=mid-1;
28 
29 }//若未找到x,则res = -1
View Code

 

二。

结对编程情况汇报:

 

合作顺利,相辅相成,互相学习,一起进步,期待下一次上机。

 

posted on 2019-10-16 20:25  maskkkk  阅读(101)  评论(0编辑  收藏  举报

导航