算法分析与设计论文
数据结构与算法分析论文(递归的讨论)

数据结构论文——递归算法的讨论所谓递归算法是把问题转化为规模缩小了的同类问题的子问题。
然后递归调用函数(或过程)来表示问题的解。
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。
递归过程一般通过函数或子过程来实现。
递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。
递归算法是一种直接或者间接地调用自身算法的过程。
在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。
所以一般不提倡用递归算法设计程序。
下面就让我们结合例子详细讨论一下递归算法。
一、递归算法的原理递归算法简单的说就是在函数中调用函数自身,不断调用,直到满足函数得出计算结果(某个条件)。
因为其需要不断循环的调用自身,所以称为递归调用。
递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢。
还有一个十分形象的例子:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事……如此循环往复到最终的要求。
递归分为2种,直接递归和间接递归。
直接递归,比如方法A内部调用方法A自身。
间接递归,比如方法A内部调用方法B,方法B内部调用方法C,方法C 内部调用方法A。
算法设计和分析课程论文

湖南理工学院课程论文论文题目贪心法的应用课程名称算法设计与分析姓名学号专业计算机科学与技术年级学院计算机日期(2014年4月10日)课程论文评价标准贪心法的应用摘要:在解决问题的过程中,通过逐步获得最优解从而获得整体最优解的策略就是贪心策略,在已经学会在解的范围可以确定的情况下,可以采用枚举或递归策略,一一比较它们最后找到最优解;但当解的范围非常大时,枚举和递归的效率会非常低。
这时就可以考虑用贪心策略。
贪心算法没有固定的框架,算法设计的关键是贪心策略的选择,贪心策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的策略的影响。
当一个问题有好几种解决方法时,贪心法应该是最好的选择之一。
本文讲述了贪心算法的含义、基本思路以及贪心算法在实例中的应用。
关键词:贪心算法;删数问题;最小生成树一、引言在平时解决问题的过程中,当一个问题就有无后向性和贪心选择性质时,贪心算法通常会给出一个简单、直观和高效的解法。
贪心算法通过一系列的选择来得到一个问题的解。
它所做的每一个选择都是当前状态下就有某种意义的最好选择,即贪心选择;并且每次贪心选择都能将问题化解为一个更小的与原问题具有相同形式的子问题。
尽管贪心算法对于很多问题不能总是产生整体最优解,但对于最短路径、最小生成树问题,以及删数问题等却可以获得整体最优解,而且所给出的算法一般比动态规划算法更为简单、直观和高效。
二、贪心算法的含义和特点(一)贪心算法的含义贪心算法是通过一系列的选择来得到问题解的过程。
贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,它总是做出在当前看来是最有的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解算法。
(二)贪心算法的特点1、从全局来看,运用贪心策略解决的问题在程序运行过程中无回溯过程,后面的每一步都是当前看似最佳的选择,这种选择依赖已作出的选择,但并不依赖未作出的选择。
2、不能保证最后求出的解是最佳的。
大学毕业论文算法设计流程的创新与改进

大学毕业论文算法设计流程的创新与改进在大学毕业论文中,算法设计流程是一个重要的环节。
准确而高效的算法设计可以帮助解决各种实际问题,并提高计算机程序的性能。
然而,随着技术的不断发展和创新,传统的算法设计方法已经不能满足现代计算需求,因此需要探索并改进算法设计流程。
首先,创新和改进算法设计流程可以从需求分析开始。
传统的算法设计过程往往直接从问题定义开始,然后逐步优化以获得最终的解决方案。
然而,这种方法容易陷入局限思维,导致无法发现更优的解决方案。
创新的做法是在问题定义之前先进行深入的需求分析,了解用户的实际需求和期望。
这样可以开拓思维,寻找更多的解决思路,并使得最终的算法设计更加贴合用户需求。
其次,创新的算法设计流程应该注重算法思想的多样性。
在过去,算法设计往往以传统的分治、动态规划和贪婪算法为主。
然而,这些算法思想在某些特定情况下可能并不适用,或者无法达到最优解。
因此,我们需要从更广泛的算法思想中寻找灵感,例如遗传算法、模拟退火算法和人工神经网络等。
同时,我们还可以将不同算法思想进行组合,以获得更加强大和高效的算法设计。
第三,创新和改进算法设计流程需要注重算法的可复用性和可扩展性。
在过去,算法的设计往往是以特定问题为基础的,难以应用于其他类似问题。
而现在,我们可以使用一种通用的算法设计框架,通过参数化和模块化的方式实现算法的可复用性。
这样,我们可以将已有的算法设计模块进行组合和重用,而不需要从头开始设计算法。
这种创新的方法可以大大提高算法设计的效率和质量。
此外,创新和改进算法设计流程还需要注重算法的效率和优化。
在过去,算法设计中往往忽略了算法的时间复杂度和空间复杂度等性能指标。
然而,随着数据量的不断增加和计算能力的提高,算法的效率成为一个非常重要的问题。
因此,创新的算法设计流程应该注重对算法的效率进行评估和优化,以提高程序的运行速度和资源利用率。
这可以通过巧妙的数据结构选择、算法步骤的简化和并行计算等方法来实现。
算法设计课程论文模板

《算法设计》课程论文题目针对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 问题是一个多峰值函数问题,在它的函数图像中具有很多山峰一样的极值点。
对这一问题,学者们提出了多种求解的算法,这些算法大致可以归结为两大类:完整算法和启发式算法。
LM和BFGS算法的性能分析与比较-毕业论文

---文档均为word文档,下载后可直接编辑使用亦可打印---摘要数值优化是机器学习的重要部分,不断研究和改进已有的优化算法,使其更快更高效,是机器学习领域的一个重要研究方向。
作为数值优化算法中具有代表性的两个二阶算法,LM和BFGS算法各有优缺点,对它们的性能进行分析和比较给二阶数值算法的改进及更广泛的应用提供重要参考。
本论文从LM和BFGS算法的数学基础开始阐述,通过对比两个算法求解多个函数极小值的问题,我们发现LM算法和BFGS算法的差异并不大。
大多数情况下LM算法能够达到更小的误差,但是迭代次数比BFGS算法稍多。
对于等高线为椭圆的函数,LM算法的收敛速度通常比BFGS算法快,但是后期运算的迭代次数比BFGS 算法多;而其他情况下LM算法和BFGS算法的收敛速度差别不大。
由于LM算法在大部分情况下的极值求解效率稍高,我们实现了基于LM算法在前向神经网络中的学习,并用于解决模式分类问题。
实验结果表明基于LM算法的前向神经网络在垃圾邮件分类应用中能取得90%以上的分类正确率。
关键词:数值优化,LM算法,BFGS算法,前向神经网络AbstractNumerical optimization is an important part of machine learning. The analysis study of existing optimization algorithms to make them faster and more efficient is an important research direction in the field of machine learning. As two popular second-order algorithms, the LM and BFGS algorithms have their own advantages and disadvantages. The analysis and comparison of their performance have great significance for the improvement of the second-order numerical algorithms and their wider application in engineering areas.This thesis starts from introducing the mathematical foundation of LM and BFGS algorithms. By comparing the performance of the two algorithms for finding the minima of different functions, we find that the LM and BFGS algorithms have similar performance for numerical optimization problems. In most cases of our experiments, the LM algorithm can achieve smaller error, but the number of iterations is slightly higher than that of the BFGS algorithm. For the functions with elliptical contours, the convergence speed of the LM algorithm is usually faster than that of the BFGS algorithm, but the iterations of later computation are much more than those of the BFGS algorithm. while in other cases,their convergence speed is almost the same. Because of the higher efficiency of the LM algorithm in most cases, the LM algorithm is employed to train feedforward neural networks which are applied to deal with some pattern classification problem. The experimental results show that the feedforward neural network trained by the LM algorithm can reach more than 90% classification accuracy in the applications of classify spam and none spam email.Keywords:Numerical optimization,LM algorithm,BFGS algorithm,Feedforward neural networks第一章绪论1.1研究背景优化算法是用来求解问题的最优解或近似最优解的[15]。
计算机教学论文:聚焦计算思维的算法分析与设计课程教学改革

计算机教学论文:聚焦计算思维的算法分析与设计课程教学改革0 引言算法是计算机科学中最具方法论性质的核心概念,被誉为计算机学科的灵魂。
图灵奖获得者Niklaus Wirth提出:算法+数据结构=程序,强调了算法在计算机领域的重要性。
在现实生活中,算法、算据和算力组成了人工智能技术的三要素;算法的新颖性和性能决定了学术论文在高水平期刊或会议上发表的可能性;算法能力测试是研究生复试和求职面试等场合常见的环节。
因此,学习并掌握好算法相关知识,对一名本科生的综合能力培养和职业发展来说非常重要。
国内外各大高校计算机专业在培养方案中,普遍开设了算法分析与设计(以下简称算法)课程,该课程以高级程序设计和数据结构为先导课程,又为人工智能等专业课程提供算法支撑,是培养方案的重要枢纽之一。
算法课程既包含抽象的理论,又强调算法的实践,对学生的逻辑思维和计算建模等能力有较高的要求,因此有必要聚焦计算思维,开展面向能力提升的课程教学改革。
1 课程教学和改革现状1.1 共性问题目前,采取小班化策略开展算法课程教学已比较普遍;多数高校选用MIT经典书籍《Introduction to Algorithms》作为教材;依托在线平台开展编程训练取得了良好的教学效果。
但在教学过程中,还存在一些共性问题。
(1)学生在理论学习时普遍存在畏难心理。
算法要求学生不仅掌握算法的实施,更强调对算法原理的理解;一些关键的算法要进行证明,如主方法、最优前缀码等,这需要大量的理论知识,涉及不少数学符号,学生容易感到枯燥和抽象,降低了学习兴趣。
(2)学生难以灵活运用算法解决实际问题。
学生往往能够较好地掌握教材中的经典问题和相应的算法,并完成课后习题和部分在线训练题,但遇到复杂的现实问题或工程问题时,要么没有思路,要么依赖直觉,无法准确构建输入输出间的解析关系。
(3)学生的基础水平和学习需求差异明显。
修读课程的学生水平参差不齐,学习动力和学习方法也各不相同,因此处在两极的学生的学习需求通常难以得到精细满足;另外,创新实验活动和程序设计竞赛吸引了部分学有余力的学生,但课程教学和第二课堂缺乏深度结合。
基于OpenCV的运动目标检测与跟踪算法仿真与分析毕业设计论文

摘要在当今社会,安全问题越来越受到人们的关注,而视频监控是保障人民群众生命财产安全的重要技术手段,同时也是目前计算机视觉与模式识别领域的研究热点之一。
视频监控历经了普通监控、网络监控到现在的智能监控三个发展阶段。
近几年来,智能监控在交通、银行、博物馆等安全性要求比较高的场所发挥了举足轻重的作用。
但由于其应用范围的广泛性、应用场景的多样性,就其技术而言仍未达到人们所期望的要求。
其算法实时性、稳定性情况还不甚理想,受雨雪等恶劣天气的影响也比较大,还需要进一步研究出更好的算法,因此它是一个十分有意义的课题。
本文设计了基于opencv的运动目标检测与跟踪系统。
进行了大量的实验,并在实验中通过多次改进系统的结构和相关的算法,达到了提高系统实时性的目的。
该系统能够打开视频文件,并对视频文件中的运动物体进行实时有效检测与跟踪。
本文的主要工作包括:在运动目标检测阶段,本文介绍了目前常用的背景差法、帧间差分法、光流法,并通过实验对其进行了多次改进,最终采用了自适应背景更新算法、以及最经典的混合高斯背景建模算法进行运动检测。
在运动目标跟踪阶段,本文利用了颜色范围和面积大小这两个简单的特性来识别目标,在满足了识别要求的前提下,大大提高了识别的速度,再一次提升了系统的实时性;在目标跟踪阶段采用Meanshift的改进算法Camshift,并根据实验结果对算法中的优缺点进行分析。
关键词:运动目标检测,运动目标跟踪,OpenCV,高斯背景建模算法,Camshift算法。
AbstractToday,security problems are becoming increasingly subject to people’s attention.Video surveillance is the most important technical means to protect people’s lives and property.It is also the most popular problems in the computer vision and pattern recognition research fields. Video Surveillance has developed three stages as the common surveillance,the network surveillance and the intelligent surveillance.In recent years,the intelligent video surveillance has played great importance in the field of Traffic,Bank,Museum and so on which have a high safety requirements.But because of the extensive and diversity of its application,as for the technology,it has not reached the expected requirements of the people.On the other hand,the stability and real-time performance of the algorithms are not so satisfied;the result is still affected by the bad weather as rain and snow.So,better algorithm is needed.Therefore,it is one of the most valuable topics.This article is designed based on the opencv moving target detection and tracking system. Done a lot of experiments and experiments through several improvements in the structure and related algorithms,to improve the system of real-time purposes.The system is able to open video files,and video files in real-time moving object detection and tracking effectively.The main work includes:the moving target detection phase,the paper describes the current common background subtraction,inter-frame difference method,optical flow,and through experiments carried out many improvements,finally adopted adaptive background updating algorithm,and the most classic Gaussian mixture background modeling algorithm for motion detection.In moving target tracking phase,the scope of this paper,the color and size of the size of these two simple features to identify the target,to meet the identification requirements under the premise,greatly improve the recognition rate,once again enhance the system in real time;in Meanshift tracking stage using the improved algorithm Camshift,and the experimental results of the algorithm to analyze the advantages and disadvantages.Key words:Moving target detection,target tracking,OpenCV,Gaussian background modelingalgorithm,Camshift algorithm.目录1绪论......................................................................11.1课题研究的背景和意义...................................................11.2国内外研究现状.........................................................11.3技术发展难点与趋势.....................................................21.4论文结构安排...........................................................32编程工具介绍..............................................................42.1opencv2.4.3简介.......................................................42.2opencv视频处理........................................................42.2.1OpenCV中处理图像Mat类............................................52.2.2OpenCV中读取视频VideoCapture类...................................62.3opencv编程环境配置....................................................62.3.1配置Windows环境变量..............................................62.3.2在VisualStudio2010中建立MFC对话框..............................72.3.3配置OpenCV函数库..................................................73运动目标检测..............................................................93.1概述...................................................................93.1.1帧间差分法.........................................................93.1.2背景差法..........................................................93.1.3光流法...........................................................103.2自适应背景更新算法....................................................113.2.1原理..............................................................113.2.2流程.............................................................113.2.3核心代码.........................................................123.2.4实验结果及分析...................................................133.3混合高斯背景建模算法.................................................153.3.1原理..............................................................153.3.2流程..............................................................163.3.3核心代码.........................................................173.3.4实验结果及分析...................................................174运动目标跟踪.............................................................214.1概述..................................................................214.2均值漂移MeanShift算法...............................................224.2.1原理..............................................................224.2.2流程图............................................................234.3Camshift算法.........................................................234.3.1原理..............................................................234.3.2流程图............................................................254.3.3核心代码.........................................................254.4实验结果及分析........................................................275软件的设计与仿真.........................................................296全文总结与展望...........................................................32参考文献...................................................................33翻译部分...................................................................35英文文献.................................................................35中文译文.................................................................45致谢.....................................................错误!未定义书签。
算法设计论文

算法设计与分析课程论文论文名称 24计算问题学院教育信息技术学院学生姓名莫怡琳、阮淑贞、陈鑫奕学号2014210972、2014210970、2014210946 2017 年 1 月 3日目录一、问题描述 (1)二、前端分析 (1)1、功能需求 (1)2、工具选择 (1)三、详细设计及说明 (1)四、算法设计思想 (4)核心算法 (4)辅助算法 (5)五、问题及解决 (6)六、总结反思 (7)七、小组分工 (7)八、小组互评 (7)九、编程日记 (8)11月29日编程日记 (8)12月6日编程日记 (8)12月7日编程日记 (9)十、源代码 (9)24计算问题一、问题描述24点游戏是指任意输入1-9的四个数,通过加减乘除四则运算连接,使得计算结果为24,而使用计算机模拟该游戏,就是让程序随机产生数字,由用户组合成表达式,交给程序进行结果判断。
二、前端分析1、功能需求(1)模式选择:根据玩家人数选择单人模式或者双人模式(2)用户登录/注册:允许用户登录、注册,确保账号安全(3)随机:自动产生随机数,供用户选择(4)验证:对用户输入的表达式进行判断(5)计算:对随机产生的数字求解,得出符合要求的表达式(6)记录:能够根据玩家的输赢情况,实时更新玩家等级(7)存储:存储并动态更新用户的相关信息,包括用户名、密码、游戏等级2、工具选择工具:DW,语言:php,用本机localhost做服务器和测试端(1)交互性强,用户能够通过鼠标、键盘等输入与网页进行交互(2)界面编写容易,div+css可以实现网页布局(3)数据存储读取方便,能够实时与AppServ自带的数据库链接(4)24点游戏本身适合做成网页版三、详细设计及说明1、模式选择:选择不同的模式将会跳转至不同游戏界面单人模式双人模式帮助:游戏规则:选择单人模式将独自完成任务,每完成一关将会上升一个等级,回答错误将会下降一个等级;选择双人模式胜利者将上升一个等级,失败者将下降一个等级。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载算法分析与设计论文地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容算法设计与分析论文题目0-1背包问题的算法设计策略对比与分析专业班级学号姓名引言对于计算机科学来说,算法(Algorithm)的概念是至关重要的。
算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度与 HYPERLINK"/view/104946.htm" \t "_blank" 时间复杂度来衡量。
算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。
或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。
算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
一个算法应该具有以下五个重要的特征:有穷性:一个算法必须保证执行有限步之后结束;确切性:算法的每一步骤必须有确切的定义;输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。
没有输出的算法是毫无意义的;可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
HYPERLINK "/view/92404.htm" \t "_blank" 计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。
1 算法复杂性分析的方法介绍算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。
一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。
计算机的资源,最重要的是时间和空间(即存储器)资源。
因而,算法的复杂性有时间复杂性和空间复杂性之分。
不言而喻,对于任意给定的问题,设计出复杂性尽可能地的算法是我们在设计算法是追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。
因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。
关于算法的复杂性,有两个问题要弄清楚:用怎样的一个量来表达一个算法的复杂性;对于给定的一个算法,怎样具体计算它的复杂性。
让我们从比较两对具体算法的效率开始。
1.1比较两对算法的效率考虑问题1:已知不重复且已经按从小到大排好的m个整数的数组A[1..m](为简单起见。
还设m=2 k,k是一个确定的非负整数)。
对于给定的整数c,要求寻找一个下标i,使得A[i]=c;若找不到,则返回一个0。
问题1的一个简单的算法是:从头到尾扫描数组A。
照此,或者扫到A的第i个分量,经检测满足A[i]=c;或者扫到A的最后一个分量,经检测仍不满足A[i]=c。
我们用一个函数Search来表达这个算法:Function Search (c:integer):integer;Var J:integer;BeginJ:=1; {初始化}{在还没有到达A的最后一个分量且等于c的分量还没有找到时,查找下一个分量并且进行检测}While (A[i]<c)and(j<m) doj:=j+1;If A[j]=c then search:=j {在数组A中找到等于c的分量,且此分量的下标为j}else Search:=0; {在数组中找不到等于c的分量}End;容易看出,在最坏的情况下,这个算法要检测A的所有m个分量才能判断在A中找不到等于c的分量。
解决问题1的另一个算法利用到已知条件中A已排好序的性质。
它首先拿A的中间分量A[m/2]与c比较,如果A[m/2]=c则解已找到。
如果A[m/2]>c,则c只可能在A[1],A[2],..,A[m/2-1]之中,因而下一步只要在A[1],A[2], .. ,A[m/2-1]中继续查找;如果A[m/2]<c,则c只可能在A[m/2+1],A[m/2+2],..,A[m]之中,因而下一步只要在A[m/2+1],A[m/2+2],..,A[m]中继续查找。
不管哪一种情形,都把下一步需要继续查找的范围缩小了一半。
再拿这一半的子数组的中间分量与c比较,重复上述步骤。
照此重复下去,总有一个时候,或者找到一个i使得A[i]=c,或者子数组为空(即子数组下界大于上界)。
前一种情况找到了等于c的分量,后一种情况则找不到。
这个新算法因为有反复把供查找的数组分成两半,然后在其中一半继续查找的特征,我们称为二分查找算法。
它可以用函数B_Search来表达:Function B_Search ( c: integer):integer;VarL,U,I:integer;{U和L分别是要查找的数组的下标的上界和下界}Found:boolean;BeginL:=1; U:=m; {初始化数组下标的上下界}Found:=false; {当前要查找的范围是A[L]..A[U]。
}{当等于c的分量还没有找到且U>=L时,继续查找}While (not Found) and (U>=L) doBeginI:=(U+L) div 2;{找数组的中间分量}If c=A[I] then Found:=Tureelse if c>A[I] then L:=I+1else U:=I-1;End;If Found then B_Search:=1else B_Search:=0;End;容易理解,在最坏的情况下最多只要测A中的k+1(k=logm,这里的log以2为底,下同)个分量,就判断c是否在A中。
算法Search和B_Search解决的是同一个问题,但在最坏的情况下(所给定的c不在A中),两个算法所需要检测的分量个数却大不相同,前者要m=2 k个,后者只要k+1个。
可见算法B_Search比算法Search高效得多。
以上例子说明:解同一个问题,算法不同,则计算的工作量也不同,所需的计算时间随之不同,即复杂性不同。
上图是运行这两种算法的时间曲线。
该图表明,当m适当大(m>m0)时,算法B_Search比算法Search省时,而且当m更大时,节省的时间急剧增加。
不过,应该指出:用实例的运行时间来度量算法的时间复杂性并不合适,因为这个实例时间与运行该算法的实际计算机性能有关。
换句话说,这个实例时间不单纯反映算法的效率而是反映包括运行该算法的计算机在内的综合效率。
我们引入算法复杂性的概念是为了比较解决同一个问题的不同算法的效率,而不想去比较运行该算法的计算机的性能。
因而,不应该取算法运行的实例时间作为算法复杂性的尺度。
我们希望,尽量单纯地反映作为算法精髓的计算方法本身的效率,而且在不实际运行该算法的情况下就能分析出它所需要的时间和空间。
1.2复杂性的计量算法的复杂性是算法运行所需要的计算机资源的量,需要的时间资源的量称作时间复杂性,需要的空间(即存储器)资源的量称作空间复杂性。
这个量应该集中反映算法中所采用的方法的效率,而从运行该算法的实际计算机中抽象出来。
换句话说,这个量应该是只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。
如果分别用N、I和A来表示算法要解问题的规模、算法的输入和算法本身,用C表示算法的复杂性,那么应该有:C =F(N,I,A)其中F(N,I,A)是N,I,A的一个确定的三元函数。
如果把时间复杂性和空间复杂性分开,并分别用T和S来表示,那么应该有:T =T(N,I,A) (2.1)和 S =S(N,I,A) (2.2)通常,我们让A隐含在复杂性函数名当中,因而将(2.1)和(2.2)分别简写为T =T(N,I)和 S =S(N,I)由于时间复杂性和空间复杂性概念类同,计算方法相似,且空间复杂性分析相对地简单些,所以下文将主要地讨论时间复杂性。
下面以T(N,I)为例,将复杂性函数具体化。
根据T(N,I)的概念,它应该是算法在一台抽象的计算机上运行所需的时间。
设此抽象的计算机所提供的元运算有k种,他们分别记为O1,O2 ,..,Ok;再设这些元运算每执行一次所需要的时间分别为t1,t2,..,tk 。
对于给定的算法A,设经过统计,用到元运算Oi的次数为ei,i=1,2,..,k ,很明显,对于每一个i,1<=i<=k,ei是N和I的函数,即ei=ei(N,I)。
那么有:(2.3)其中ti,i=1,2,..,k,是与N,I无关的常数。
显然,我们不可能对规模N的每一种合法的输入I都去统计ei(N,I),i=1,2,…,k。
因此T(N,I)的表达式还得进一步简化,或者说,我们只能在规模为N的某些或某类有代表性的合法输入中统计相应的ei ,i=1,2,…,k,评价时间复杂性。
下面只考虑三种情况的复杂性,即最坏情况、最好情况和平均情况下的时间复杂性,并分别记为Tmax(N )、Tmin(N)和Tavg(N )。
在数学上有:(2.4)(2.5)(2.6)其中,DN是规模为N的合法输入的集合;I *是DN中一个使T(N,I *)达到Tmax(N)的合法输入,是DN中一个使T(N,)到Tmin(N)的合法输入;而P(I)是在算法的应用中出现输入I 的概率。
以上三种情况下的时间复杂性各从某一个角度来反映算法的效率,各有各的用处,也各有各的局限性。
但实践表明可操作性最好的且最有实际价值的是最坏情况下的时间复杂性。
下面我们将把对时间复杂性分析的主要兴趣放在这种情形上。
一般来说,最好情况和最坏情况的时间复杂性是很难计量的,原因是对于问题的任意确定的规模N达到了Tmax(N)的合法输入难以确定,而规模N的每一个输入的概率也难以预测或确定。
我们有时也按平均情况计量时间复杂性,但那时在对P(I)做了一些人为的假设(比如等概率)之后才进行的。
所做的假设是否符合实际总是缺乏根据。
因此,在最好情况和平均情况下的时间复杂性分析还仅仅是停留在理论上。
2 常见的算法分析设计策略介绍我们一般常见的几种算法分析设计策略主要有:动态规划、贪心算法、回溯法、分支限界法。
接下来我主要介绍一下这几种算法。
1.1动态规划动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。