算法设计与分析基础
- 格式:ppt
- 大小:544.00 KB
- 文档页数:47
学习算法的经典教材推荐在计算机科学领域,算法是一门重要的学科。
学习算法不仅可以提高我们解决问题的能力,还可以培养我们的逻辑思维和分析能力。
因此,选择一本好的算法教材是非常重要的。
在本文中,我将向大家推荐几本经典的算法教材,希望对大家的学习有所帮助。
1.《算法导论》(Introduction to Algorithms)《算法导论》是由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein合著的一本经典教材。
这本书系统地介绍了算法设计和分析的基本原理,包括排序、图算法、动态规划等。
它以清晰的语言和丰富的示例,帮助读者理解算法的核心思想和实现细节。
《算法导论》适合作为算法课程的教材,也适合作为算法学习的参考书。
2.《算法(第4版)》(Algorithms, Part I)《算法(第4版)》是由Robert Sedgewick和Kevin Wayne合著的一本经典教材。
这本书以Java语言为基础,介绍了常见的算法和数据结构,包括排序、查找、图算法等。
它不仅提供了清晰的解释和示例代码,还包含了大量的练习题和编程项目,帮助读者巩固所学知识。
《算法(第4版)》适合初学者入门,也适合有一定算法基础的读者进一步深入学习。
3.《算法设计与分析基础》(Foundations of Algorithm Design and Analysis)《算法设计与分析基础》是由王晓东、王晓燕和李海霞合著的一本经典教材。
这本书以算法设计和分析为核心,介绍了常见的算法思想和技术,包括贪心算法、动态规划、分治算法等。
它注重理论与实践的结合,通过真实的案例和实验分析,帮助读者理解算法的应用场景和效果评估。
《算法设计与分析基础》适合计算机科学专业的学生和从业人员,也适合对算法感兴趣的读者。
4.《算法之美》《算法之美》是由吴军著的一本畅销书。
虽然不是传统的教材,但它以通俗易懂的语言,介绍了算法在现实生活中的应用和影响。
算法设计与分析课程教学大纲【适用专业】计算机科学与技术【课时】理论课时:32【学分】 2【课程性质、目标和要求】《算法设计与分析》是计算机科学与技术专业的专业课。
无论是计算科学还是计算实践,算法都在其中扮演着重要角色。
本课程的教学目的是讲授在计算机应用中常常遇到的实际问题的解法,讲授设计和分析各种算法的基本原理、方法和技术,培养学生对算法复杂性进行正确分析的能力。
课程基本要求是⑴掌握算法分析的基本概念和理论。
⑵掌握算法设计技术和分析算法以及算法复杂性。
【教学时间安排】本课程计 2 学分,理论课时32, 学时分配如下:【教学内容要点】第一章算法引论一、学习目的要求1.了解算法的计算复杂性分析方法2.理解算法分析的基本理论3.掌握算法分析的基本概念二、主要教学内容1. 算法的基本概念2. 表达算法的抽象机制3. 采用Java语言与自然语言相结合的方式描述算法的方法4. 算法的计算复杂性分析方法第二章递归与分治策略一、学习目的要求1.理解典型范例中递归与分治策略应用技巧2.掌握递归与分治策略3.掌握数学归纳法证明算法正确性方法二、主要教学内容1. 递归的概念2. 分治法的基本思想3. 二分搜索技术4. 大整数的乘法5. Strassen阵乘法6. 棋盘覆盖7. 合并排序8. 快速排序9. 线性时间选择10. 最接近点对问题11. 循环赛日程表第三章动态规划一、学习目的要求1.理解典型范例中动态规划算法的设计思想2.掌握动态规划算法的基本要求以及算法的设计要点二、主要教学内容1. 矩阵连乘问题2. 动态规划算法的基本要素3. 最长公共子序列4. 最大子段和5. 凸多边形最优三角剖分6. 多边形游戏7. 图像压缩8. 电路布线9. 流水作业调度10. 0—l背包问题11. 最优二叉搜索树12. 动态规划加速原理三、课堂讨论选题1. 最长公共子序列2. 0—l背包问题第四章贪心算法一、学习目的要求1.了解贪心算法的理论基础及基本要素2. 理解典型范例中贪心算法的设计思想3. 掌握贪心算法的设计要点二、主要教学内容1. 活动安排问题2. 贪心算法的基本要素3. 最优装载4. 哈夫曼编码5. 单源最短路径6. 最小生成树7. 多机调度问题8. 贪心算法的理论基础三、课堂讨论选题1. 最优装载2. 单源最短路径第五章回溯法一、学习目的要求1.理解回溯法的效率分析方法2.掌握回溯法的算法框架和应用技巧二、主要教学内容1. 回溯法的算法框架2. 装载问题3. 批处理作业调度4. 符号三角形问题5. n后问题6. 0—l背包问题7. 最大团问题8. 图的m着色问题9. 旅行售货员问题10. 圆排列问题11. 电路板排列问题12. 连续邮资问题13. 回溯法的效率分三、课堂讨论选题1. 0—l背包问题2. 图的m着色问题第六章分支限界法一、学习目的要求1.理解分支限界法的基本思想2.掌握典型范例中分支限界法的应用技巧二、主要教学内容1. 分支限界法的基本思想2. 单源最短路径问题3. 装载问题4. 布线问题5. 0-1背包问题6. 最大团问题7. 旅行售货员问题8. 电路板排列问题9. 批处理作业调度三、课堂讨论选题1. 0-1背包问题2. 批处理作业调度第七章概率算法一、学习目的要求1.理解概率算法的基本思想2.掌握典型范例中概率算法的应用技巧二、主要教学内容1. 随机数2. 数值概率算法3. 舍伍德算法4. 拉斯维加斯算法5. 蒙特卡罗算法第八章 NP完全性理论一、学习目的要求1.了解P类与NP类问题2.了解典型的NP完全问题二、主要教学内容1. 计算模型2. P类与NP类问题3. NP完全问题4. 一些典型的NP完全问题第九章近似算法一、学习目的要求1.掌握近似算法的基本思想2.掌握常用近似算法的应用二、主要教学内容1. 近似算法的性能2. 顶点覆盖问题的近似算法3. 旅行售货员问题近似算法4. 集合覆盖问题的近似算法5. 子集和问题的近似算法第十章算法优化策略一、学习目的要求1.掌握算法优化策略2.掌握算法优化的基本方法二、主要教学内容1. 算法优化策略的比较与选择2. 动态规划加速原理3. 问题的算法特征4. 优化数据结构5. 优化搜索策略【教学(实验)内容要点】算法设计与分析实验是算法设计与分析课的一个实践性教学环节。
作业一学号:_____ 姓名:_____说明:1、正文用宋体小四号,1.5倍行距。
2、报告中的图片、表格中的文字均用宋体五号,单倍行距。
3、图片、表格均需要有图片编号和标题,均用宋体五号加粗。
4、参考文献用宋体、五号、单倍行距,请参照参考文献格式国家标准(GB/T 7714-2005)。
5、公式请使用公式编辑器。
P144.用伪代码写一个算法来求方程ax2+bx+c=0的实根,a,b,c 是任意实系数。
(可以假设sqrt(x)是求平方根的函数。
)算法:Equate(a,b,c)//实现二元一次方程求解实数根//输入:任意系数a,b,c//输出:方程的实数根x1,x2或无解If a≠0p←b2−4acIf p>0x1←−b+sqrt(p)2ax2←−b−sqrt(p)2areturn x1,x2else if p=0return −b2aelsereturn “no real roots”elseif b≠0return −cbelseif c≠0return “no real numbers”elsereturn “no real roots”5.写出将十进制正整数转换为二进制整数的标准算法。
a.用文字描述。
b.用伪代码描述。
a.解:输入:一个正整数n输出:正整数n相应的二进制数第一步:用n 除以2,余数赋给K[i](i=0,1,2...),商赋给n第二步:如果n=0 ,则到第三步,否则重复第一步第三步:将K[i]按照i从高到低的顺序输出b.解:算法:DecToBin(n)//实现正整数十进制转二进制//输入:一个正整数n//输出:正整数n对应的二进制数组K[0..i]i ←1while n≠0 doK[i]←n%2n←(int)n/2i ++while i≠0doprint K[i]i - -p462.请用O,Ω 和θ的非正式定义来判断下列断言是真还是假。
a. n(n+1)/2∈O(n3)b. n(n+1)/2∈O(n2)c. n(n+1)/2∈θ(n3)d. n(n+1)/2∈Ω(n)解:断言为真:a,b,d断言为假:cP535.考虑下面的算法。
一、实训背景随着计算机科学技术的飞速发展,算法作为计算机科学的核心,其设计与应用越来越受到重视。
为了提高我们的算法设计能力,培养解决实际问题的能力,我们开展了为期一个月的算法设计实训。
本次实训以《算法设计与分析》课程为基础,通过理论学习、实验操作和实践应用,使我们深入理解了算法的基本概念、设计方法和分析技巧。
二、实训内容1. 理论学习(1)回顾了算法的基本概念,包括算法、算法复杂度、时间复杂度和空间复杂度等。
(2)学习了常用的算法设计方法,如分治法、动态规划、贪心算法、回溯法等。
(3)了解了不同算法的应用场景和适用范围。
2. 实验操作(1)使用C++语言实现了多种算法,如快速排序、归并排序、二分查找、插入排序等。
(2)针对实际问题,设计了相应的算法,如矩阵链相乘、背包问题、最小生成树等。
(3)对实验结果进行了分析,对比了不同算法的性能。
3. 实践应用(1)以小组为单位,针对实际问题进行算法设计,如数字三角形、投资问题等。
(2)编写程序代码,实现所设计的算法。
(3)对程序进行调试和优化,提高算法效率。
三、实训成果1. 提高了算法设计能力:通过实训,我们掌握了多种算法设计方法,能够根据实际问题选择合适的算法。
2. 增强了编程能力:实训过程中,我们熟练掌握了C++编程语言,提高了编程技巧。
3. 深化了算法分析能力:通过对算法复杂度的分析,我们能够更好地理解算法性能。
4. 培养了团队合作精神:在实训过程中,我们学会了与他人沟通、协作,共同完成任务。
四、实训总结1. 实训过程中,我们遇到了许多困难,如算法设计思路不明确、编程错误等。
通过查阅资料、请教老师和同学,我们逐步克服了这些问题。
2. 实训过程中,我们认识到算法设计的重要性。
一个好的算法可以显著提高程序运行效率,解决实际问题。
3. 实训过程中,我们学会了如何将实际问题转化为数学模型,并设计相应的算法。
4. 实训过程中,我们提高了自己的自学能力和解决问题的能力。
5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty . (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。
2、算法的复杂性取决于:(1)求解问题的规模(N) , (2)具体的输入数据(I),( 3)算法本身的设计(A),C=F(N,I,A。
3、算法的时间复杂度的上界,下界,同阶,低阶的表示。
4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。
5、常用的几种数据结构:线性表、树、图。
第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。
递归的时间复杂性可归结为递归方程:1 11= 1T(n) <aT(n—b) + D(n) n> 1其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。
递归元的递减方式~有两种:1、减法,即n -b,的形式。
2、除法,即n / b,的形式。
2、D(n)为常数c:这时,T(n) = 0(n P)。
D(n)为线形函数cn:r O(n) 当a. < b(NT(n) = < Ofnlog^n) "n = blljI O(I1P)二"A bl吋其中.p = log b a oD(n)为幕函数n x:r O(n x) 当a< D(b)II JT{ii) = O(ni1og b n) 'ia = D(b)ll].O(nr)D(b)lHJI:中,p= log b ao考虑下列递归方程:T(1) = 1⑴ T( n) = 4T(n/2) +n⑵ T(n) = 4T(n/2)+n2⑶ T(n) = 4T(n/2)+n3解:方程中均为a = 4,b = 2,其齐次解为n2。
对⑴,T a > b (D(n) = n) /• T(n) = 0(n);对⑵,•/ a = b2 (D(n) = n2) T(n) = O(n2iog n);对⑶,•/ a < b3(D(n) = n3) - T(n) = 0(n3);证明一个算法的正确性需要证明两点:1、算法的部分正确性。
《算法设计与分析》教案张静第1章绪论算法理论的两大论题:1. 算法设计2. 算法分析1.1 算法的基本概念1.1.1 为什么要学习算法理由1:算法——程序的灵魂➢问题的求解过程:分析问题→设计算法→编写程序→整理结果➢程序设计研究的四个层次:算法→方法学→语言→工具理由2:提高分析问题的能力算法的形式化→思维的逻辑性、条理性1.1.2 算法及其重要特性算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。
算法的五大特性:⑴输入:一个算法有零个或多个输入。
⑵输出:一个算法有一个或多个输出。
⑶有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
⑷确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
⑸可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
1.1.3 算法的描述方法⑴自然语言优点:容易理解缺点:冗长、二义性使用方法:粗线条描述算法思想注意事项:避免写成自然段欧几里德算法⑶程序设计语言优点:能由计算机执行缺点:抽象性差,对语言要求高使用方法:算法需要验证注意事项:将算法写成子函数欧几里德算法#include <iostream.h>int CommonFactor(int m, int n) {int r=m % n;while (r!=0){m=n;n=r;r=m % n;}return n;}void main( ){cout<<CommonFactor(63, 54)<<endl;}⑷伪代码——算法语言伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
优点:表达能力强,抽象性强,容易理解使用方法:7 ± 2欧几里德算法1. r = m % n;2. 循环直到 r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;3. 输出 n ;1.1.4 算法设计的一般过程1.理解问题2.预测所有可能的输入3. 在精确解和近似解间做选择4. 确定适当的数据结构5.算法设计技术6.描述算法7.跟踪算法8.分析算法的效率9.根据算法编写代码1.2 算法分析算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算➢时间复杂性(Time Complexity)➢空间复杂性(Space Complexity)算法分析的目的:➢设计算法——设计出复杂性尽可能低的算法➢选择算法——在多种算法中选择其中复杂性最低者时间复杂性分析的关键:➢ 问题规模:输入量的多少;➢ 基本语句:执行次数与整个算法的执行时间成正比的语句for (i=1; i<=n; i++)for (j=1; j<=n; j++)x++;问题规模:n基本语句:x++1.2.1 渐进符号1. 大O 符号定义1.1 若存在两个正的常数c 和n 0,对于任意n ≥n 0,都有T (n )≤c ×f (n ),则称T (n )=O (f (n ))2. 大Ω符号定义1.2 若存在两个正的常数c 和n 0,对于任意n ≥n 0,都有T (n )≥c ×g (n ),则称T (n )=Ω(g (n ))问题规模n 执行次3. Θ符号定义1.3 若存在三个正的常数c 1、c 2和n 0,对于任意n ≥n 0都有c 1×f (n )≥T (n )≥c 2×f (n ),则称T (n )=Θ(f (n ))例: T (n )=5n 2+8n +1当n ≥1时,5n 2+8n +1≤5n 2+8n +n=5n 2+9n ≤5n 2+9n 2≤14n 2=O (n 2)当n ≥1时,5n 2+8n +1≥5n 2=Ω(n 2)∴ 当n ≥1时,14n 2≥5n 2+8n +1≥5n 2则:5n 2+8n +1=Θ(n 2)0问题规模n 执行次数问题规模n 执行次数定理 1.1 若T(n)=amnm +am-1nm-1 + … +a1n+a0(am>0),则有T(n)=O(nm)且T(n)=Ω(n m),因此,有T(n)=Θ(n m)。
计算机算法设计与分析的基础知识测试计算机算法设计与分析是计算机科学与技术领域中的重要内容之一。
掌握算法设计与分析的基础知识,对于解决实际问题、优化计算过程具有重要作用。
本文将通过测试的方式来检验读者对于计算机算法设计与分析的基础知识的掌握情况。
一、选择题(每题5分,共20题)1. 下列哪个不是算法的特性?A. 有穷性B. 确定性C. 可行性D. 并发性2. 空间复杂度是用来评估算法在运行过程中所需的存储空间的指标,其单位一般是:A. 比特B. 字节C. 秒D. 无单位3. 关于时间复杂度的描述,下列哪个是错误的?A. 时间复杂度用来评估算法执行速度的指标B. 时间复杂度一般用大O表示法表示C. 时间复杂度为O(n)的算法比时间复杂度为O(n^2)的算法更快D. 时间复杂度为O(logn)的算法比时间复杂度为O(nlogn)的算法更快4. 在排序算法中,下列哪个算法的最坏情况时间复杂度为O(nlogn)?A. 冒泡排序B. 插入排序C. 快速排序D. 选择排序5. 哈希表是一种常见的数据结构,其查找操作的时间复杂度是多少?A. O(1)B. O(logn)C. O(n)D. O(n^2)6. 下列哪个不是图的表示方法?A. 邻接矩阵B. 邻接表C. 散列表D. 十字链表7. 广度优先搜索(BFS)和深度优先搜索(DFS)是用来解决什么类型的问题的算法?A. 最短路径问题B. 拓扑排序问题C. 最小生成树问题D. 图的遍历问题8. 哪个排序算法在平均情况下具有最好的性能?A. 冒泡排序B. 插入排序C. 快速排序D. 选择排序9. 动态规划是一种解决问题的算法思想,下列哪个问题不适合使用动态规划进行求解?A. 最大子数组和问题B. 最长递增子序列问题C. 最短路径问题D. 0/1背包问题10. 哈夫曼编码是一种常用于数据压缩的算法,其原理是通过将出现频率较高的字符用较短的编码表示,下列哪个字符的编码长度最长?A. 出现频率最高的字符B. 出现频率最低的字符C. 出现频率相等的字符D. 哈夫曼编码的编码长度与字符的出现频率无关二、填空题(每题5分,共5题)1. 在快速排序算法中,选择的基准元素一般是______。
算法设计与分析的基本方法1.递推法递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法.递推是序列计算机中的一种常用算法。
它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定象的值。
其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。
2.递归法程序调用自身的编程技巧称为递归(recursion)。
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:(1) 递归就是在过程或函数里调用自身;(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
3.穷举法穷举法,或称为暴力破解法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。
例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。
理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。
因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。
4.贪心算法贪婪算法是一种对某些求最优解问题的更简单、更迅速的设计技术。
用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。
算法分析与设计基础(清华版)Taken from "Introduction to The Design and Analysis of Algorithms" by Anany Levitin节选自《算法设计与分析基础》潘彦译蛮力法就像宝剑不是撬棍一样,科学也很少使用蛮力。
——Edward Lytton (1830 - 1873),leila,第二卷,第一章认真做事常常是浪费时间。
——Robert Byrne,撞球大师,台球选手和作家人们是这样描述它的:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。
这里的“力”是指计算机的能“力”,而不是人的智“力”。
我们也可以用“直接做吧!”来描述蛮力法的策略。
而且一般来说,蛮力策略也常常是最容易应用的方法。
虽然巧妙和高效的算法很少来自于蛮力法,但我们不应该忽略它作为一种重要的算法设计策略的地位。
第一,和其他某些策略不同,我们可以应用蛮力法来解决广阔领域的各种问题(实际上,它可能是惟一一种几乎什么问题都能解决的一般性方法)。
具体来说,蛮力法常常用于一些非常基本、但又十分重要的算法,比如计算n个数字的和,求一个列表的最大元素,等等。
第二,对于一些重要的问题来说(比如:排序、查找、矩阵乘法和字符串匹配),蛮力法可以产生一些合理的算法,它们多少具备一些实用价值,而且并不限制实例的规模。
第三,如果要解决的问题实例不多,而且蛮力法可以用一直能够接受的速度对实例求解,那么,设计一个更高效算法所花费的代价很可能是不值得的。
第四,即使效率通常很低,仍然可以用蛮力算法解决一些小规模的问题实例。
最后,一个蛮力算法可以为研究或教学目的服务,例如,它可以作为准绳,来衡量同样问题的更高效算法。
下列这些著名的算法可以看作是蛮力法的例子:基于定义的矩阵乘法算法;选择排序;顺序查找;简单的字符串匹配算法。
穷举查找是解组合问题的一种蛮力方法。