算法(Algorithm)是解决问题的具体方法,是解题方案的准确而完整的描述。简单地说,算法就是准确完整地阐述解决问题的方案,明确给出解决问题的具体步骤(第一步干什么,第二步干什么,……)。
“算法”即演算法,中文名称出自《周髀算经》;而英文名称Algorithm 来自于9世纪波斯数学家al-Khwarizmi,al-Khwarizmi在数学上提出了算法这个概念。“算法”原为"algorism",意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。欧几里得算法被人们认为是史上第一个算法。因为"well-defined procedure"(无歧义的、不会导致矛盾的、符合其应满足的所有要求的程序)缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要作用。
算法(Algorithm)是解决问题的具体方法,是解题方案的准确而完整的描述。简单地说,算法就是准确完整地阐述解决问题的方案,明确给出要解决问题的具体步骤(第一步干什么,第二步干什么,……)。算法是程序的灵魂,设计算法是程序设计的核心。我们说编程的过程是对逻辑思维的训练和强化,其实这主要是通过算法来体现的。
一、算法的特征
一个算法应该具有以下五个重要的特征:
- 有穷性。算法的有穷性是指算法必须能在执行有限个步骤之后终止;
- 确切性。算法的每一步骤必须有确切的定义,不能有歧义;
- 有输入。一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 有输出。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性。算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成。
二、算法的要素
算法的要素指的是算法内容的组成。算法应该由以下两个部分组成:
- 数据对象的运算和操作。计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:
- 算术运算:加减乘除等运算
- 逻辑运算:或、且、非等运算
- 关系运算:大于、小于、等于、不等于等运算
- 数据传输:输入、输出、赋值等运算
- 算法的控制结构。一个算法的功能结构不仅取决于所选用的操作,还与各操作之间的执行顺序有关。
三、算法的评定
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
1.时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模\(n\)的函数\(f(n)\),算法的时间复杂度也因此记做:\(T(n)=Ο(f(n))\)
一般地,问题的规模\(n\)越大,算法执行的时间的增长率与\(f(n)\)的增长率正相关。
2.空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
四、算法的分类
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法等。
常用的算法包括:递推法、递归法、穷举法、贪心算法、动态规划法、迭代法、分支界限法、回溯法等。
五、算法的描述
描述算法的方法有多种,常用的有自然语言、伪代码、流程图和PAD图等,其中使用最普遍的是流程图。
以前面计算圆的周长和面积为例,简单的用自然语言描述的算法可以是:
- 输入圆的半径
- 利用圆周长公式计算并输出圆的周长
- 利用圆面积公式计算并输出圆的面积
更贴合编程的自然语言描述:
- 输入圆的半径\(R\)
- 计算圆的周长\(C=2 \times \pi \times R\)
- 计算圆的面积\(S= \pi \times R^2\)
- 输出周长\(C\)、面积\(S\)
伪代码描述(\(Input\)输入,\(Output\)输出,\(←\)如同赋值符号一样表示赋值为):
- \(Input \ R\)
- \(C ← 2 * \pi * R\)
- \(S ← \pi * R * R\)
- \(Output \ C,S\)
流程图描述如下:
流程图常用的符号如下表所示:
【思考】
\(n\)(\(1 \le n \le 100\))位选手要参加100米赛跑,标准田径场有8条跑道均可安排选手,如何安排(安排几组,每组每条跑道多少人)可以让每组人数均匀?可以从下图分析每组人数均匀的具体要求。