针对各种类型的问题,拟定出有效的解决方法和步骤,也就是算法。可以说,设计算法是程序设计的核心。
简单来说,为解决一个问题而采取的具体方法和操作步骤,就称为“算法”。比如在解决一个数值计算问题时,我们不仅要选择合适的计算方法(像用什么数学公式),还要根据这个方法,详细设计出计算机每一步该怎么执行才能算出结果的算法。所以,对程序员来说,掌握设计算法并根据算法编写程序是必备技能。
同一个问题,往往有多种不同的解决思路和步骤。通常,我们希望找到方法更简单、计算步骤更少的方案。因此,光算法正确还不够,还要考虑算法的质量,选择最合适、最高效的算法。
解决一个计算问题,一般会经历下面几个步骤:
1. 明确问题与目标: 首先要清楚地知道要解决什么问题,最终要达到什么要求。一开始就要把问题了解得详细、准确,避免模糊不清的地方。
2. 分析问题,建立模型: 理解问题背后的原理(比如物理过程),然后用数学语言把它描述出来。例如,列出解题需要的数学公式或方程组,这就是建立数学模型。
3. 选择计算方法: 确定用哪种具体的数学方法或思路来计算。比如求定积分,可以用矩形法、梯形法或辛普森法等不同的近似方法。用计算机解题前,必须先选定要用的计算方法。
4. 确定算法并画流程图: 在动手写程序代码之前,要先理清思路,规划好每一步具体怎么计算或处理。把这些步骤用方框图画出来,每个框代表要完成的一个或一组操作,这种图展示了整个工作的流程,叫做流程图。
5. 编写程序: 根据设计好的算法(通常用流程图表示),用编程语言写出计算机可以执行的代码。
6. 程序调试(试算): 对程序进行测试和修改。复杂的程序往往需要反复测试、修正错误,才能最终得到正确、可用的程序。
7. 正式运行并输出结果: 运行调试好的程序,得到我们需要的计算结果。
一个合格的算法必须具备以下三个关键特征:
① 有穷性: 算法必须在执行有限步骤后结束。
② 确切性: 算法的每一个步骤都必须清晰、明确地定义,没有歧义。
③ 可行性: 算法描述的操作必须是可以执行的,并且能在实际可接受的时间内解决特定的问题。
算法主要分为两大类:
· 数值运算算法: 主要用于数学计算(如解方程、积分)。
· 非数值运算算法: 用于数据处理(如排序、查找、信息管理)等非纯计算任务。
设计和评价算法时,需要考虑它的效率,主要体现在:
· 时间复杂度: 算法运行需要多少时间(通常用执行基本操作的次数衡量)。
· 空间复杂度: 算法运行需要占用多少计算机内存空间。
我们经常会听到一些常见的算法名称,例如:
归并排序、快速排序、堆排序 (Heap Sort,原“堆积排序”)、傅立叶变换 (数学工具,其计算实现是算法)、快速傅立叶变换 (FFT)、狄克斯特拉算法 (Dijkstra,最短路径算法)、RSA非对称加密算法、哈希安全算法 (如SHA系列)、整数质因子分解算法、链接分析算法 (如PageRank)、比例-积分-微分算法 (PID控制算法,原“比例微积分算法”)、数据压缩算法 (如ZIP, JPEG)、随机数生成算法、二分查找算法、冒泡排序算法、线性查找算法、深度优先搜索、广度优先搜索、动态规划算法、朴素贝叶斯分类算法。