喻定 算法设计论文Word文件下载.docx
《喻定 算法设计论文Word文件下载.docx》由会员分享,可在线阅读,更多相关《喻定 算法设计论文Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
对于计算机科学来说,算法的概念是至关重要的,例如,在一个大型软件系统的开发中,设计出有效的算法将起决定性的作用。
算法是解决问题的一种方法或一个过程。
程序是算法用某种设计语言具体实现描。
计算机的普及极大的改变了人们的生活。
目前,各行业、各领域都广泛采用了计算机信息技术,并由此产生出开发各种应用软件的需求。
为了以最小的成本、最快的速度、最好的质量开发出适合各种应用需求的软件,必须遵循软件工程的原则。
设计一个高效的程序不仅需要编程小技巧,更需要合理的数据组织和清晰高效的素算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。
二常见的算法分析设计策略介绍
1动态规划
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。
但是经分解得到的子问题往往不是互相独立的。
不同子问题的数目常常只有多项式量级。
在用分治法求解时,有些子问题被重复计算了许多次。
如果能够保存已解决的子问题的答案,而在需要时再找出已求得的
答案,就可以避免大量重复计算,从而得到多项式时间算法。
动态规划的一般步骤:
找出最优解的性质,并刻划其结构特征。
递归地定义最优值。
以自底向上的方式计算出最优值。
根据计算最优值时得到的信息,构造最优解。
2贪心算法
顾名思义,贪心算法总是作出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
具有最优子结构性质的问题,用贪心算法更简单、更直接且解题效率更高。
当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法
不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
如单源最短路经问题,最小生成树问题等。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
三解决问题的过程
10-1背包问题用动态规划算法
问题描述
0-1背包问题:
给定n种物品和一个背包。
物品i的重量是Wi,其价值为Vi,背包的容量是c。
问应如何选择装入背包中的物品,使得装入背包中的物品总价值最大。
在选择装入背包的物品时,对每种物品i只能有两种选择,装入包或者不装入。
不能物品i装入包多次,也不能只装入部分的物品i。
此问题的形式化描述是,给定c>
0,Wi>
0,Vi>
0,1≤i≤n,要求找出一个n元0-1向量(x1,x2,……xn),Xi∈{0,1},1≤i≤n,使得
<
=c,而且
达到最大。
因此0-1背包问题是一个特殊的整数规划问题:
max
=C
∈{0,1},1<
=i<
=n
算法描述:
设所给0-1背包问题的子问题max∑(Vk*Xk)k=i..n;
max∑(Vk*Xk)<
=j(k=i..n);
Xk∈{0,1},i<
=k<
=n;
的最优值为m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。
程序:
main()
{
Intm,n,i,j,r;
Intx[100],w[100],p[100],p1[100],b[100],s,max;
input(m,n);
//1.当所有物体重量和比书包的容量小,那么这些
//物体全选
for(i=1,s=0;
i<
=n;
i++)
input(w[i],p[i]);
P1[i]=p[i];
s=s+w[i];
//所有物体的重量和
}
if(s<
=m)//判断是否物体总重小于书包的容量
{print(“wholechoose”);
//全选
Return;
//2.将每个物体的利润与重量比
/
按从大到小
//排序
for(i=1;
{max=1;
For(j=2;
j++)
//逐个比较物体的利润与重量比,将较大的赋//给max
if(p1[j]/w[j]>
p1[max]/w[max])max=j;
p1[max]=0;
b[i]=max;
floatr=m;
//背包容纳总量
x[]={};
//初始化为0
{if(w[b[i]]>
r)break;
//是否物体总重小于书包//的容量
x[i]=1;
r=r-w[b[i]];
2部分背包问题用贪心算法
问题描述:
假定有n个物体和一个背包,物体i有质量wi,价值为pi,而背包的载荷能力为M。
若将物体i的一部分xi(1<
=n,0<
=xi<
=1)装入背包中,则有价值pi*xi。
在约束条件
(w1*x1+w2*x2+…………+wn*xn)<
=M下使目标(p1*x1+p2*x2+……+pn*xn)达到极大,此处
0<
=1,pi>
0,1<
=n.这个问题称为背包问题(Knapsackproblem)。
算法描述首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重
量价值最高的物品装入背包。
若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。
依此策略一直地进行下去,直到背包装满为止。
程序代码:
//m为总重量,n为个体数量,w为重量,p为价//值r为剩余容量x为物体的百分数
//3.按已排好的顺序放到书包里
s<
mandi<
s=s+w[b[i]];
>
m)//当物体重量不等于书包的容量
//减去前一个物体s-w[b[i-1]的重量
w[b[i-1]]=m-(s-w[b[i-1]]);
r=m-w[b[i-1]];
x[i]=r/w[i];
//取物体的几分之几正好满足剩余
//容量
W[b[i]]=x[i]W[b[i]];
//加上最后一个
for(j=1;
j<
=i-1;
j=j+1)//逐个输出
//所选每个物体的序号和重量
print(“choose”,b[j],”weight”,w[b[j]]);
动态规划算法:
全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解。
边界条件:
即最简单的,可以直接得出的局部最优解
贪心算法:
贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。
由前面中的介绍,可以知道贪心法正确的条件是:
每一步的最优解一定包含上一步的最优解。
四结合自身情况谈谈本课程学习体会及其影响
算法是编程最终的部分,想要把程序写的好,就要用好的算法。
不同的问题有不同的算法模型,同一个问题也可能有不同的算法描述。
每种算是都有自己的时间复杂度和空间复杂度。
并不是说时间复杂度低或者空间复杂度就是一个好的算法,这要看用来解决什么问题,还编程的环境结合起来评价的。
所以学编程的人应该把算法学好,这样才有利于编程,也有利于想出更好的算法来解决现实中的问题。
以前我写程序只是习惯性的选自己常用的一种算法,无论是什么样的问题都会去用一个算法。
从没有考虑算法是不是适合这个问题。
也不会去考虑时间复杂度和空间复杂。
可能是因为所编的程序比较短,算法的优越性体现不出。
在学完了这本书之后,我才只能算法的优越性有多么的重要。
如果一个大程序没有好的算法来支持,程序运行花费的时间和占据的空间都将是很大的。
有的可能会导致严重的错误性。
我想,通过对这门课程的学期,我以后编程的时候就会首先考了算法的问题,不再是盲目的乱写。
对以后的学习会有很大的帮助。
参考文献
[1]算法设计与分析(第二版)清华大学出版社
[2]C程序设计谭浩强著清华大学出版社