算法设计结课论文
- 格式:docx
- 大小:10.87 KB
- 文档页数:7
摘要:随着深度学习技术的快速发展,其在图像识别领域的应用日益广泛。
本文对一篇关于深度学习在图像识别中应用的论文进行了总结,分析了该论文的研究背景、方法、实验结果和结论。
一、研究背景近年来,图像识别技术在安防监控、医疗诊断、自动驾驶等领域得到了广泛应用。
然而,传统的图像识别方法在处理复杂场景和大规模数据时存在一定的局限性。
随着深度学习技术的兴起,其在图像识别领域的应用取得了显著成果。
本文针对深度学习在图像识别中的应用进行了研究。
二、研究方法1. 数据集:论文选取了公开的ImageNet数据集,该数据集包含1000个类别,共计1400万张图像。
2. 模型:论文采用了一种基于卷积神经网络(CNN)的深度学习模型。
该模型由多个卷积层、池化层和全连接层组成,能够提取图像特征并进行分类。
3. 损失函数:论文采用交叉熵损失函数作为模型的损失函数,用于衡量预测结果与真实标签之间的差异。
4. 优化算法:论文采用Adam优化算法对模型进行训练,该算法能够自适应地调整学习率,提高训练效率。
三、实验结果1. 在ImageNet数据集上,论文提出的模型在图像识别任务上取得了较高的准确率,达到了74.3%。
2. 与其他深度学习模型相比,论文提出的模型在复杂场景和大规模数据上的识别效果更优。
3. 通过对比实验,论文验证了卷积神经网络在图像识别任务中的有效性。
四、结论本文通过对一篇关于深度学习在图像识别中应用的论文进行总结,得出以下结论:1. 深度学习技术在图像识别领域具有显著的应用价值。
2. 基于卷积神经网络的深度学习模型在图像识别任务上具有较好的性能。
3. 随着深度学习技术的不断发展和完善,其在图像识别领域的应用前景十分广阔。
五、展望1. 未来研究可以针对不同类型的图像识别任务,进一步优化深度学习模型。
2. 探索深度学习与其他技术的结合,提高图像识别的准确率和鲁棒性。
3. 将深度学习应用于更多领域,如医疗诊断、自动驾驶等,推动人工智能技术的发展。
程序设计与算法分析结课论文在当今数字化的时代,程序设计与算法分析已经成为计算机科学领域的核心组成部分。
从智能手机中的各种应用程序,到互联网上的搜索引擎和电子商务平台,再到科学研究中的模拟和数据分析,程序设计和算法的身影无处不在。
它们不仅影响着我们的日常生活,还推动着科技的不断进步和社会的发展。
程序设计,简单来说,就是告诉计算机要做什么以及如何去做。
它涉及到使用特定的编程语言来编写指令,让计算机按照我们的意愿执行任务。
一个好的程序设计应该具有清晰的逻辑结构、易于理解和维护的代码,以及高效的性能。
而要实现这些目标,就需要对编程语言的语法、数据结构和控制结构有深入的理解。
以常见的编程语言如 Python 为例,它提供了丰富的数据类型,如整数、浮点数、字符串、列表、字典等,以及各种控制结构,如条件语句(ifelse)、循环语句(for、while)等。
通过合理地运用这些元素,我们可以编写出解决各种问题的程序。
比如,要编写一个程序计算两个数的平均值,我们可以使用以下的 Python 代码:```pythonnum1 = 5num2 = 10average =(num1 + num2) / 2print("平均值为:", average)```这只是一个简单的例子,但它展示了程序设计的基本思路:明确问题、选择合适的数据结构和算法、编写代码并进行测试。
算法分析则是对程序所使用的算法的性能进行评估和优化。
一个算法的性能通常用时间复杂度和空间复杂度来衡量。
时间复杂度表示算法运行所需的时间与输入规模之间的关系,而空间复杂度表示算法运行所需的存储空间与输入规模之间的关系。
例如,对于一个排序算法,我们可以比较冒泡排序、插入排序和快速排序的时间复杂度。
冒泡排序的时间复杂度为 O(n^2),插入排序的时间复杂度也为 O(n^2),而快速排序的平均时间复杂度为 O(nlogn)。
在处理大规模数据时,快速排序的性能通常要优于冒泡排序和插入排序。
算法设计期末总结在这个学期的算法设计课程中,我学到了许多关于算法设计和分析的知识和技巧。
通过课程的学习和实践,我对算法设计的原则、常用算法和问题求解的方法有了更深入的理解。
本文将对我在本学期算法设计课程中所学到的内容进行总结,并对未来的学习和发展提出一些展望。
一、算法设计的基本原则在算法设计的过程中,有一些基本原则是需要遵循的。
首先,算法应该是正确的,即能够解决给定的问题。
其次,算法的效率也是非常重要的,因为对于大规模问题,如果算法的时间和空间复杂度太高,将导致运行时间过长或者无法处理。
另外,算法应该是可读性和可维护性好的,便于其他人理解和修改。
最后,算法的稳定性也是需要考虑的,即对于输入的变化,算法的输出应该是一致的。
二、常用的算法和数据结构在算法设计中,有一些常用的算法和数据结构可以帮助解决大部分的问题。
其中,常见的数据结构有线性表、树、图等,而常用的算法有排序、查找、图算法等。
对于不同类型的问题,选择合适的数据结构和算法是非常重要的,可以大大提高算法的效率。
在课程的学习中,我对线性表、树和图等数据结构进行了详细的学习和实践。
线性表是一种最简单的数据结构,常见的有数组和链表。
对于线性表的操作,如插入、删除、查找等,有不同的实现方法和时间复杂度。
树是一种常见的非线性结构,有很多种类型,如二叉树、堆等。
树的遍历和查找是树算法中常见的操作。
图是一种复杂的数据结构,由节点和边组成,有很多种表示方法和算法。
图的遍历和最短路径算法是图算法中重要的内容。
此外,排序算法是算法设计中重要的一部分。
我学习了冒泡排序、插入排序、选择排序、快速排序、归并排序等常见的排序算法,并对它们的思想、实现和时间复杂度有了更深入的理解。
三、问题求解的方法在算法设计中,我们经常需要求解各种类型的问题,如搜索问题、优化问题等。
对于不同类型的问题,有一些常见的求解方法可以参考。
其中,穷举法、贪心法、动态规划法是常见的求解方法。
穷举法是一种简单直观的求解方法,它通过枚举所有可能的解来找到问题的解。
计算机科学学生在学习中的算法设计总结算法设计是计算机科学领域中的基础性技能,对于计算机科学学生来说,熟练掌握算法设计能力对于他们的学习和职业发展都至关重要。
本文将总结计算机科学学生在学习中的算法设计经验,并探讨如何提高算法设计能力。
一、算法设计的重要性及挑战算法设计是计算机科学学生学习过程中最关键的一部分。
算法决定了计算机程序的执行效率和准确性,直接影响到软件和系统的性能。
然而,算法设计并非易事,它需要学生具备深厚的理论知识和灵活的思维能力。
同时,学生还需要面对各种不同类型的算法问题,如排序、查找、图算法等,每个问题都有其特定的解决方法和算法设计技巧。
二、算法设计的基本原则在学习算法设计过程中,学生应牢记以下基本原则:1. 明确问题:在解决任何算法问题之前,学生首先要明确问题的定义和要求,确保自己对问题的理解准确无误。
2. 分析问题:学生需要深入分析问题,并考虑输入、输出以及约束条件等因素,以便找到最佳的算法设计方案。
3. 寻找已有算法:学生可以借鉴已有的算法设计思路,通过学习和研究相关的经典算法,从中汲取经验和灵感,并灵活运用于解决新的问题。
4. 设计和优化算法:学生需要根据问题的特点和要求,设计出合适的算法,并进行优化,以提高程序的执行效率和性能。
5. 测试和验证:学生在设计算法时,应进行充分的测试和验证,确保算法能够正确解决问题,并满足预期的时间和空间复杂度要求。
三、提高算法设计能力的方法1. 学习基础知识:学生需要通过系统学习计算机科学的基础知识,掌握数据结构、算法分析和复杂度理论等相关概念和原理,为算法设计提供坚实的理论基础。
2. 多做练习:算法设计需要持续的练习和实践,学生可以尝试解决不同类型的算法问题,并逐步提高解题速度和设计技巧。
3. 参与竞赛和项目:参与程序设计竞赛和实际项目可以锻炼学生的算法设计能力,拓宽视野,并与他人进行交流和合作,提升自己的算法设计水平。
4. 跟随导师指导:学生可以寻找优秀的导师或指导老师,跟随其指导,学习其经验和技巧,提高自己的算法设计能力。
前言 (1)正文 (1)2.1设计的目的和意义 (1)2.1.1设计的目的 (1)2.1.2设计的意义 (1)2.2设计的目标与总体方案 (1)2.1.1设计的目标 (1)2.1.2设计的总体方案 (2)2.3设计的方法和内容 (2)2.3.1硬件环境要求 (2)2.3.2软件环境需求 (2)2.3.3设计的流程图 (2)2.3.4设计的方法及详细内容 (2)2.3.4.1让用户输入信息 (2)2.3.4.2数据整理 (3)2.3.4.3查找数据并输出结果 (4)2.3.4.4询问用户是否继续 (5)2.4设计的创新与关键技术 (6)2.4.1设计的特点 (6)2.4.2设计的难点 (7)2.4.3软硬件调试及结果分析 (7)2.5结论 (7)致谢 (7)参考文献: (8)附录: (9)算法研究是计算机科学的核心。
近年来,算法领域去得了很多重要的进展。
这些进展包括快速算法的开发,如发明了傅里叶变换开速算法,以及不存在有效算法的本质问题的惊人发现。
这些结果点燃了计算机学者对算法研究的兴趣。
算法设计与分析已成为一个受到广泛注意的领域。
计算机的普及极大地改变了人们的生活。
目前,各行业、各领域都广泛采用了计算机的信息技术,并由此产生出开发各种应用软件的需求。
为了最少的成本、最快的速度、最好的质量开发出适合各种应用需求的软件,必须遵循软件工程的原则。
设计一个高效的程序不仅需要编程小技巧,更需要合理的数据组织和清晰高效的算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。
一些著名的计算机科学家在有关计算机科学教育的论述中认为,计算机科学是一中创造性思维活动,其教育必须面向设计。
计算机算法设计与分析正是一门面向设计,且处于计算机学科核心地位的教育课程。
通过对计算机算法系统的学习与研究,掌握算法设计的主要法方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定坚实的理论基础。
0/1背包问题的算法分析研究【摘要】0/1背包为题是一个典型的NP问题,关于这个问题有多种不同的解法。
这里主要总结了分治、动态规划、贪心和回溯算法的设计思想,以及分别用他们解决0/1背包问题的时间和空间复杂度分析比较,总结这四种方法实现的优缺点。
我们发现用贪心算法解0/1背包问题只能得到近似最优解而不能得到真正的最优解,且在不同的约束条件下,四种算法各有优劣。
【关键字】0/1背包问题、分治法、动态规划法、贪心算法、回溯算法0/1 knapsack problem analysis algorithm【Abstract】Zero-first knapsack is a classic on the topic of NP problems on this issue there are many different solutions. Here main summary of divide-and-conquer, dynamic programming, greedy and backtracking algorithm design ideas, as well as with their zero-first knapsack problem-solving analysis and comparison of the time and space complexity, advantages and disadvantages of summing up the implementation of the four methods. We found using the greedy algorithm solution zero-first knapsack problem can only be approximate optimal solution not been real optimal solutions, and under different constraint conditions, four kinds of algorithms have their pros and cons.【Key Words】Zero-first knapsack problem, Divide and conquer, dynamic programming, greedy algorithms, backtracking algorithm目录1 引言 (3)2 问题的提出 (3)2.1问题符号化 (3)3 分治算法 (4)3.1 算法设计思想 (4)3.2 适合用分治法策略的问题 (4)3.3 算法设计步骤 (4)3.4 算法分析 (5)4 动态规划算法 (5)4.1 算法设计思想 (5)4.2 适合动态规划法解决的问题 (5)4.3 算法设计步骤 (5)4.4 用动态规划法解决0/1背包问题 (6)4.4.1 算法分析 (7)5 贪心算法 (7)5.1 算法设计思想 (7)5.2 适合用贪心算法解决的问题 (8)5.3 算法设计步骤 (8)5.4 算法分析 (8)6 回溯算法分析研究 (9)6.1 算法设计思想 (9)6.2 适合用回溯算法解决的问题 (9)6.3 算法设计步骤 (9)6.4 用回溯算法解决0/1背包问题 (9)6.4.1 算法分析 (12)7 分支限界算法分析研究 (12)7.1 算法设计思想 (12)7.2 常见的两种分支限界法 (12)7.3 用优先队列分支限界法解决0/1背包问题 (13)8 各种算法解决0/1背包问题的优缺点比较分析 (14)9对回溯算法的优化 (14)10 结束语 (16)【参考文献】 (17)1 引言计算机算法设计与分析是面向设计的、处于核心地位的一门学科。
算法设计与分析结课论文Hash技术学生姓名:***学号:**********专业:计算机科学与技术年级:2009级完成日期:2010年月日指导教师:***成绩:Hash技术摘要:随着科技日益发展,Hash函数的重要性越来越突出。
本文介绍了几种构造Hash 的方法,例如直接定址法、数字分析法、平方取中法、折叠法、除留余数法等,在构造Hash函数时,应当注意两点问题:(1)函数值应在1至记录总数之间。
(2)尽量避免冲突。
还介绍了几种处理Hash算法冲突的方法。
除此之外,阐明了Hash函数的优缺点和它在现实生活中的应用。
关键词:Hash函数,构造方法,应用,优缺点目录1.绪论1.1 什么是算法1.2 搜索算法2.Hash函数2.1 Hash函数的基本概念2.2 Hash函数的基本思想与一般模型2.3 Hash函数的构造3. 处理冲突的方法3.1 开放定址法3.2 再哈希法3.3 链地址法3.4 建立一个公共溢出区4. Hash算法的优劣分析5. Hash函数的应用5.1 完整性的验证5.2 数字签名5.3 认证协议5.4 加密算法6. 总结1. 绪论1.1 什么是算法算法的概念在计算机科学与技术领域几乎无处不在,在各种计算机系统的实现中,算法的设计往往处于核心的位置。
1.2 搜索算法搜索问题是计算机技术面对的基本课题之一,自20世纪70年代以来,计算机应用的主流逐渐从计算机密集型向着数据密集型转化,计算机存储和处理的数据量越来越大,结构越来越复杂,因此,对搜索算法的研究始终是人们研究的重要领域。
搜索算法与其他问题不同,它与数据结合的组织形式密切相关。
在大多数情况下,搜索算法实际上是作为某种数据类型的运算或操作而不断的被调用的,搜索算法的优劣与数据结构密切相关。
2. Hash函数2.1 Hash函数的基本概念Hash函数是把任意长度的二进制串映射到特定长度的二进制串函数,是最基本的二进制函数之一。
Hash函数也被称为“凑数函数”,但这个名称很少被采用,70年代之前也被称为散列函数,现在我们经常将其称之为Hash或译为哈什。
算法设计与分析论文学院:计算机学院专业:计算机科学与技术姓名:***学号:************1.简述动态规划算法求解问题的一般步骤。
答:⑴找出最优解的性质,并刻画其机构特征;⑵递归地定义最优值;⑶以自底向上的方式计算出最优值;⑷根据计算最优值时地带的信息,构造最优解。
6.简述回溯法求解问题的一般步骤。
答:(1)用回溯法解题通常包含一下3个步骤(2)针对所给问题,定义问题的解空间;(3)确定易于搜索的解空间;(4)以深度优先方式搜索解空间,并在搜索过程中用剪枝反函数避免无效搜索。
1、工作分配问题:设有n 件工作分配给n 个人。
将工作i 分配给第j 个人所需费用为ij c 。
为每一个人分配一件不同的工作,并使总费用达到最小。
1.1设计算法工作分配按照遍历应该有n!种分法,从中找出所需费用最少的费用。
这里采用递归的方法解决问题对于每一条路径所需费用为expense=∑=ni ip j 1c ,其中j ip c 表示第i 建工作分配给第p i个人时所需费用,p1~p n互不相同,即每个人只能分配一件工作。
在计算的时候可以设计expense(i)等于分配过第i件工作后这时所达到的总费用,分配第i+1i+1件工作,总费用expense(i+1)=expense(i)+j ip c,当i<n时,继续递归,当i=n时判断本此分配的工作总费用是否比之前保存的最低费用小,是则把此次分配总费用值赋给minexpense,并保存此次分配的路径给q[]。
可以设计如下递归函数void workdistribute(int i,int n,int *p,int x[],int c[][N]){for(int j=1;j<=n;j++){if(x[j]==0){x[j]=1;x[0]+=c[i][j];p[i]=j;if(i<n){workdistribute(i+1,n,p,x,c);}else{if(minexpense>x[0]||minexpense==-1){minexpense=x[0];for(int k=1;k<=n;k++)q[k]=p[k];}x[0]-=c[i][j];}x[j]=0;}}}1.2分析计算复杂度1.3程序实现进行宏定义N大小为100,在以后可以重新赋值#define N 100int q[N]={0};//定义全局变量q数组用来保存工作分配路径int minexpense=-1;//定义全局变量用来保存分配中最小费用void workdistribute(int i,int n, int p[],int x[],int c[][N]);主函数void main() {int n=0;int c[N][N];int x[N]={0};int p[N]={0};printf("\t\t\t\1.工作分配问题n\n");printf("请输入人数\n");scanf("%d",&n);下面用来输入所需费用for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)scanf("%d",&c[i][j]);}调用workdistribute(1,n,p,x,c);函数进行递归分配工作,递归结束后进行输出最小费用和此分法,以矩阵的形式显示workdistribute(1,n,p,x,c);printf("%d\n",minexpense);此循环用来输出最少费用的分配方法for(int k=1;k<=n;k++){for(int j=1;j<=n;j++){if(q[k]!=j)printf(" ");elseprintf("%d ",c[k][j]);}printf("\n");}}//workdistribute(i,n,p,x,c)函数设计,传递进行分配的是第几件工作i,已分配过的人X[],分配的路径p[],以及费用数组c[][],用X[]来保存已非配工作所需费用void workdistribute(int i,int n,int *p,int x[],int c[][N]){for(int j=1;j<=n;j++){if(x[j]==0){x[j]=1;x[0]+=c[i][j];p[i]=j;if(i<n)//当未分配完时继续调用{workdistribute(i+1,n,p,x,c);}else//最后一事件分配完后,判断此次分配是不是最小费用{if(minexpense>x[0]||minexpense==-1)//如果是最小分配或第一次分配,则保存此次分配数据{minexpense=x[0];for(int k=1;k<=n;k++)q[k]=p[k];}}x[j]=0;x[0]-=c[i][j];//返回上一层之前,先减去此事件分配的费用}}}1.4最后通过简例说明程序实现过程输入事件数为3输入费用矩阵 C32 1 34 5 21 2 1第一层第一次分配workdistribute(1,n,p,x[],c[][N]);分配过程c[1][1],c[2][2],c[3][3] 此时最小费用是8 赋值给minexpense,并把1,2,3保存在q数组,最后一层递归返回上一次,第二中分配方式c[1][1],c[2][3],c[3][2]此时费用时6,minexpense为6,1,3,2保存在q中,第一层第一次分配完毕,然后循环workdistribute(2,n,p,x[],c[][N]);第三种分配,c[1][2],c[2][1],c[3][3],minexpesne=6,q[]:为1,3,2,第四次分配c[1][2],c[2][3],c[3][1],minexpense=4,q[]:2,3,1 第一层第二次分配完毕,然后循环workdistribute(3,n,p,x[],c[][N]);第五种分配c[1][3],c[2][1],c[3][2],minexpense=4,q[]:2,3,1,第六种分配c[1][3],c[2][2],c[3][1],minexpense=4,q[]:2,3,1 返回主程序,输出minexpense,q[],2,3,1。
《算法设计》课程论文题目针对UBQP问题的量子文化基因算法学生姓名学号院系计算机与软件学院专业计算机科学与技术指导教师刘文杰2015年6 月30 日目录1 引言 (2)2 ** 算法简介 (3)3 针对UBQP问题的量子文化基因算法(QEA-TS) (3)3.1算法思想 (3)3.2算法流程 (3)3.3算法过程描述 (5)3.3.1输入权值矩阵 (5)3.3.2 量子染色体初始化 (5)3.3.3 染色体观测 (5)3.3.4禁忌搜索 (6)3.3.5评估适应度值 (7)3.3.6 量子旋转门和更新 (7)3.3.7算法终止条件 (10)3.4本章小结 (11)4代码实现与结果分析 (11)4.1代码实现 (11)4.2运行结果分析与比较 (12)4.2.1参数设置 (12)4.2.2运行结果分析与比较 (12)5 小结 (14)针对UBQP 问题的量子文化基因算法1 引 言无约束0-1二次规划问题(Unconstrained Binary Quadratic Problem ,UBQP )是一类选取合适的二进制决策变量,使得二次目标函数值极大化的优化问题,该问题用数学表达式可以写成UBQP :QX X x f T =)((1)的形式,其中Q 是一个n n ⨯对称矩阵,一般写成上三角的形式,是常量,X 是n 维二进制向量(每个分量都是0或者1),即需要求的解。
这是一个典型的NP (Non-deterministic Polynomial )难题,它有许多方面的应用,如计算机辅助设计,社会心理学,交通管理,金融分析,机器调度等等。
同时,UBQP 问题是组合优化问题的一种通用模型,大多数组合优化问题都能够转化成该问题后进行求解,如图着色问题,多维背包问题,最大团问题,集合分割问题等等。
同时UBQP 问题是一个多峰值函数问题,在它的函数图像中具有很多山峰一样的极值点。
对这一问题,学者们提出了多种求解的算法,这些算法大致可以归结为两大类:完整算法和启发式算法。
算法毕业论文算法毕业论文700字随着计算机技术的飞速发展,算法也成为了计算机科学的重要组成部分。
本文将介绍几种经典的算法及其应用,以及算法的未来发展方向。
首先,我将介绍最基础的算法之一——冒泡排序算法。
冒泡排序算法是一种简单直观的排序算法,其基本思想是多次遍历待排序的元素,比较相邻的元素并交换位置,将最大(或最小)的元素逐步“冒泡”到最后。
尽管冒泡排序算法的时间复杂度较高,但由于其简单易懂,便于理解,所以在教学和小规模排序中仍然有一定的应用。
其次,我将介绍一个在图像处理领域广泛应用的算法——Canny边缘检测算法。
Canny边缘检测算法是一种经典的边缘检测算法,它能够判断图像中的边缘,并能够将边缘进行精确定位。
该算法主要包括五个步骤:高斯滤波、计算像素梯度和方向、非极大值抑制、高低阈值分割、边缘连接。
Canny边缘检测算法的实现相对复杂,但其准确性和可靠性都较高,因此被广泛应用于图像处理领域。
另外,我将介绍一种用于解决旅行商问题的算法——遗传算法。
旅行商问题是一个经典的组合优化问题,目标是找到一个最短的路径,使得旅行商能够依次访问所有城市并回到起始城市。
遗传算法是一种模拟生物进化的算法,它通过模拟复制、交叉和变异等生物进化过程,搜索解空间,寻找问题的最优解。
遗传算法具有较强的并行性和全局优化能力,在解决旅行商问题等复杂优化问题上取得了一定的成效。
最后,我将探讨算法的未来发展方向。
随着技术的更新换代,算法领域也在不断进步和创新。
目前,人工智能、机器学习等领域的快速发展对算法提出了新的需求和挑战。
未来的算法将更加注重处理大规模数据和复杂问题,同时也将更加注重算法的效率和性能优化,以适应不断增长的计算需求和应用场景。
总之,算法作为计算机科学的核心内容,在各个领域都具有重要的应用价值。
本文介绍了几种经典的算法及其应用,以及算法的未来发展方向。
相信随着技术的进步和创新,算法将发挥更大的作用,并为人们的生活带来更多便利和智能化的服务。
Hunan Institute of Science and Technology 算法设计与分析结课论文
老师:陶跃进
姓名:张立
班级:网工一班
学号:14134501641
目录
1绪论....................................................... 3・・
2、算法的概念................................................ 3・・
3、算法的历史................................................ 4・・
4、算法的分类................................................ 5・・
5、最大子段和问题 (6)
・
6、课后感想.................................................. 7・・
1、绪论
算法设计与分析是一门与数据结构密不可分的课程,从中可以了解到算法设计对数据结构中的数据存储结构更深层次的运用。
计算机算法设计与分析是面向设计的、处于核心地位的一门学科。
纵观计算机学科数十年发展的历史,算法与设计复杂性理论一直是计算机科学研究的热点领域,也是获得图灵奖最多的研究领域之一。
面对计算机领域的大量问题,最重要的是根据问题的性质选择正确的求解思路,即找到一个好的算法。
特别在复杂的、海量信息的处理中,一个好的算法往往起着决定性作用。
本文就此学期的算法设计与分析课程的学习展开了一系列的讲述。
2、算法的概念
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
算法代表着用系统的方法描述解决问题的策略机制。
也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
一个算法应该具有以下五个重要的特征:有穷性、确切性、输入、
输出、可行性。
我觉得这是它本身就应该具备的,如果没了这些,我们又为什么花费心思学习它呢,所以这些并不是让我们热衷算法的理由。
高效,才是我们所向往的,而算法又恰恰能满足人们对高效的要求,所以我们才会努力学习它。
3、算法的历史
"算法”即演算法的大陆中文名称出自〈〈周髀算经》;而英文名称Algorithm 来自于9世纪波斯数学家al-Khwarizmi ,因为al-Khwarizmi在数学上提出了算法这个概念。
“算法”原为"algorism", 意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。
欧几
里得算法被人们认为是史上第一个算法。
第一次编写程序是Ada Byron于1842年为巴贝奇分析机编写求解伯努利方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。
因为查尔斯•巴贝奇(Charles Babbage未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。
因为"well-defi ned procedure"缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。
20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。
图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要作用。
4、算法的分类
本学期的算法设计思想我们主要学习了分治算法、动态规划、贪心法、回溯法和分支界限法。
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。
求出子问题的解,就可得到原问题的解。
它通常用的是递归算法,而我所熟悉的是二分检索法。
动态规划的设计步骤是把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。
它通常用于求解具有某种最优性质的问题。
因其这个特效,动态规划技术已在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。
贪心法是一种通用的算法设计技术,在许多最优化问题求解中得到了广泛应用。
比如著名的图的最小生成树的Prim算法和Kruskal
算法,单源最短路径的Dijkstra算法,数据压缩的哈夫曼算法等。
特别是对于许多NP难得组合优化问题,目前仍没有找到有效的算法,于是采用比较好的近似算法就成了一种可行的途径,而贪心法常用于
这些近似算法的设计。
回溯法将搜索空间看作一定的结构,通常为树形结构,一个解对应于树中的一片树叶。
算法从树根出发,尝试所有可达的结点。
当不能前行时,就后退一步或若干步,再从另一个结点继续搜索,直到所有节点都试探过。
回溯算法遍历一棵树可以用深度优先、宽度优先等多种方法。
分支界限法是回溯法的变种。
当回溯法搜索到某结点时,如果代价函数的函数值小于界函数的函数值,则在搜索该结点的后代时,所找到的可
行解的目标函数值不可能比界函数值更大,即不可能找到更优的解,因而我们可以用分支界限法来解决这个问题。
5、最大子段和问题
在本学期的算法设计课程中,最大子段和问题是我接触较早的问题,也是令我印象最深的一个。
其主要的功能就是给定有n个整数(可能有负整数)组成的序列(a1,a2, ,an)的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
其代码为:
#i nclude<iostream.h>
void MaxSum(int n,int a[])
此算法的时间复杂度为0( n)。
这是我记忆最深的算法了!!
在生物信息学中,我们经常可以用到这个算法。
如序列对比、亲
子鉴定等。
只要我们输入两个DNA片段的核苷酸序列,通过求解其最大子段和即可得出两个序列的相似度,从而得出两个序列的相关性。
所以,算法设计这门课程并不是遥不可及的,而是与我们的生活息息相关的。
6、课后感想
通过算法设计与分析这门课,我知道可以通过一些简单的算法来解决生活中遇到的复杂问题。
这门课给了我很多以前不知道的算法思想开拓了我们的思维,丰富了我知识结构,也让我知道其实生活中没有不能解决的难题。
但这门课也还是有一定的难度的,仅仅只经过这个学期短短一段时间的学习是远远不够的,大部分的算法思路还是有一定的了解,如果真正的让我们自主做一个算法,我想大部分人在伪代码这步就有些望洋兴叹了。
正如老师所说,虽然我们这本书已经学完了,以后我们说不定还会把它拿出来看一看。
既然有用,为何不学得更好一点呢?不要把它放在角落里,就放在书桌上,闲着就看看!! !。