算法笔记

1. 分治法能解决的问题一般具有什么特征
2. 解空间树的动态搜索过程
3. 递归优点?那为什么有的问题还要用非递归

动态规划法与分治法的异同、动态规划法与贪心法的异同、分支限界与回溯

分析性能特点。
例,填表:动态规划法
画图:贪心法求TSP、图着色,回溯法、分支限界法

 

 

 

5、a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。
b.请拿该算法与解同样问题的蛮力算法做一个比较。
解:
a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。

算法 MaxMin(A[l..r],Max,Min)
//该算法利用分治技术得到数组A中的最大值和最小值
//输入:数值数组A[l..r]
//输出:最大值Max和最小值Min
if(r=l) Max←A[l];Min←A[l]; //只有一个元素时
else
if r-l=1 //有两个元素时
if A[l]≤A[r] Max←A[r]; Min←A[l]
else Max←A[l]; Min←A[r]
else //r-l>1
MaxMin(A[l,(l+r)/2],Max1,Min1); //递归解决前一部分
MaxMin(A[(l+r/)2+1..r],Max2,Min2); //递归解决后一部分
if Max1<Max2 Max= Max2
//从两部分的两个最大值中选择大值
if Min2<Min1 Min=Min2;
//从两部分的两个最小值中选择小值
}

 

b.蛮力法的算法如下:
算法 simpleMaxMin(A[l..r])
//用蛮力法得到数组A的最大值和最小值
//输入:数值数组A[l..r]
//输出:最大值Max和最小值Min
Max=Min=A[l];
for i=l+1 to r do
if A[i]>Max Max←A[i];
else if A[i]<Min Min←A[i]
return Max,Min
}
时间复杂度t(n)=2(n-1)
算法分治算法的时间复杂度为3n/2-2,蛮力法的时间复杂度为2n-2,都属于Θ(n),但比较一下发现,分治算法的速度要比蛮力法的快一些。


求众数:
众数是在一组数据中,出现次数最多的数据,是一组数据中的原数据,而不是相应的次数。   
一组数据中的众数不止一个,
如数据2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据中的众数。 一般来说,一组数据中,出现次数最多的数就叫这组数据的众数。例如:1,2,3,3,4的众数是3。
但是,如果有两个或两个以上个数出现次数都是最多的,那么这几个数都是这组数据的众数。   
例如:1,2,2,3,3,4的众数是2和3。
还有,如果所有数据出现的次数都一样,那么这组数据没有众数。 
例如:1,2,3,4,5没有众数。对于给定的由n个自然数组成多重数集S,计算S的众数及其重数。


设计思路 :利用快速排序将数据集S排序,再遍历整个数组,利用Number类记录每个数出现的频率,从而找出集合的众数和重数。

用动态规划法求解TSP问题:求从1出发,经过2,3,4再回到1的最短路径长度。

回溯法

 

最优解为(1,2,1,2,3)

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-06-17 09:29  夜游星  阅读(442)  评论(0编辑  收藏  举报