计算机算法设计与分析小论文图文稿Word下载.docx
《计算机算法设计与分析小论文图文稿Word下载.docx》由会员分享,可在线阅读,更多相关《计算机算法设计与分析小论文图文稿Word下载.docx(6页珍藏版)》请在冰豆网上搜索。
![计算机算法设计与分析小论文图文稿Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/27/cbd12dbe-d9b8-42f8-9d1d-6bc9319d1792/cbd12dbe-d9b8-42f8-9d1d-6bc9319d17921.gif)
或者说就是用自己来定义自己,不断调用自己的某一种状态。
1.2递归算法满足的条件
(1)递归满足2个条件:
1)有反复执行的过程(调用自身)
2)有跳出反复执行过程的条件(递归出口)
1.3递归例子
递归例子:
阶乘问题
n!
=n*(n-1)*(n-2)*...*1(n>
0)
//阶乘
intresult(inti)
{
intsum=0;
if(0==i)
return
(1);
else
sum=i*result(i-1);
returnsum;
}
可见一个递归算法都有一个比较特殊的特点,那就是要先处理一些比较特殊的情况再处理递归关系。
如上例中如果是0!
的话!
那么他的阶乘就是1,所以先处理0!
这个特殊情况,然后再调用其他的递归关系得到自己想要的阶乘。
比如当我们想要求出4!
的结果那么我们就需要调用result(3)的结果而result(3)又要调用result
(2)的结果!
就这样直到得出答案为止。
在我们日常,递归算法的出现可以帮助我们解决很多问题,正因为它的:
结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
2.分治算法
2.1分治算法介绍:
一个分治算法把问题实例划分成若干子实例(多数情况是分成两个),并分别递归地解决每个子实例,然后把这些子实例的解组合起来,得到原问题实例的解。
2.2分治算法的特性
1)规模小,则很容易解决
2)大问题可以分为若干规模小的相同问题
3)利用子问题的解可以合并成该问题的解
2.3分治算法的遇到问题
为了阐明这个方法,考虑这样一问题:
在一个整数组A[1...n]中,同时寻找最大值和最小值。
下面我们来看一下用分治策略:
将数组分割成两半,A[1...n/2]和A[(n/2)+1...n],在每一半中找到最大值和最小值,并返回这两个最小值中的最小值及这两个最大值中的最大值。
过程
Min-Max
ⅰ输入
n个整数元素的数组A[1...n]n为2的幂
ⅱ输出(
x,y),A中的最大元素和最小元素
ifhigh-low=1then
ifA[low]<
A[high]thenreturn(A[low],A[high]);
else
return(A[high],A[low]);
endif
mid==[(low+high)/2];
x1==min(low,mid);
y1==max(low,mid);
x2==min(mid+1,high);
y2==min(mid+1,high);
x==min(x1,x2)
y==max(y1,y2)
return(x,y)
endif
可见当我们在一个数组中如何同时选择最大最小值时,分治算法时一个不错当选择。
如上例中所示,我们把一个数组分成了low部分和high部分两个较小当部分,然后求出他们的mid。
用lowhigh部分分别和mid比较把其最大最小值进行存放,最后再比较存放数当最大最小值。
我们考虑的例子中只考虑了时2的幂的情况。
而且分成的子问题都是相互独立的,如果子问题不独立而是出现重复子问题那往往我们选择的不是分治算法而是采用动态规划算法求解更加便利。
3.动态规划:
3.1动态规划介绍
动态规划算法,就是递推+重复子问题。
该算法效率主要与重复子问题的处理有关。
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.
典型的题目有陪审团、最大公共子串问题,流水作业调度,矩阵乘法
背包问题和0-1背包问题
3.2动态规划介绍例子
例:
最大公共子串问题
这个是动态规划的基础题目。
这个问题,不妨设第一个串为a,长度为n,第二个串为b,长度m。
那么最长的子序列长度为f(n,m)
当a[n]=a[m]时f(n,m)=1+f(n-1,m-1)
否则f(n,m)=max(f(n-1),f(m-1))
同时建立一个存储计算过的f(x,y)的矩阵,如果计算过了就直接使用。
2.对已集装箱问题中的背包问题和0-1背包问题的区别。
背包问题可以将一个整体进行拆分存放,而0-1背包问题必须存放的是一个整体!
直到出现最大价值为之。
比如当c=50而我这有三个小箱a.b.c重量分别是10.20.30而价值分别对应60.100.120!
这时当我们考虑装箱时!
用背包问题的思想,不管是背包还是0-1背包都要体现价值最大化。
在这使用背包问题这价值为60+100+80分别是装了a,b,和c的20重量!
当我们考虑用0-1背包时最大价值为100+120分别装了b,c。
这就是两者最大价值的实现和不同点。
4.贪心算法:
是指在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
该算法的应用:
最小生成树,最短路径,哈夫曼编码
活动时间安排的问题
设有N个活动时间集合,每个活动都要使用同一个资源,比如说会议场,而且同一时间内只能有一个活动使用,每个活动都有一个使用活动的开始si和结束时间fi,即他的使用区间为(si,fi),现在要求你分配活动占用时间表,即哪些活动占用该会议室,哪些不占用,使得他们不冲突,要求是尽可能多的使参加的活动最大化,即所占时间区间最大化!
1.#include?
<
iostream>
2.usingnamespacestd;
3.
4.voidGreedyChoose(intlen,int*s,int*f,bool*flag);
5.
6.intmain(intargc,
7.char*
8.argv[])
9.{
10.ints[11]={1,3,0,5,3,5,6,8,8,2,12};
11.intf[11]={4,5,6,7,8,9,10,11,12,13,14};
12.
13.boolmark[11]={0};
14.
15.GreedyChoose(11,s,f,mark);
16.for(inti=0;
i<
11;
i++)
17.if(mark[i])
18.cout<
"
19."
;
20.system("
pause"
);
21.return0;
22.}
23.
24.voidGreedyChoose(intlen,int*s,int*f,bool*flag)
25.{
26.flag[0]=true;
27.intj=0;
28.for(inti=1;
len;
++i)
29.if(s[i]>
=f[j])
30.{
31.
32.flag[i]=true;
33.j=i;
34.}
35.
36.}
得出结果是03710,也就是对应的时间段
本次课程的心得体会:
计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。
很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。
算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。
如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂性和时间复杂度来衡量。
算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。
算法设计与分析是计算机科学与技术的一个核心问题。
因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。
学习算法分析与设计使我对软件基础知识中算法的地位有了充分的了解,认识到光书本的知识的确不行,还是要理论联系实践才行。
因此不断的练习是必要的,上机实践更重要虽然课程结束了,但我依然还会继续学习算法分析与设计,以后我将充分利用所学到我实际的开发项目中。