一、什么是算法
- 算法是指对解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
- 算法代表着用系统的方法描述解决问题的策略机制。
- 一个算法的优劣可以用空间复杂度和时间复杂度 来衡量。
- 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率
- 算法分析的目的在于选择合适算法和改进算法
空间复杂度:是对一个算法在运行过程中临时占用存储空间大小量度
时间复杂度:程序运行时基本操作所执行的次数
二、算法的历史
算法(algorithm)一词源于9世纪波斯数学家花拉子米。是一个由已知求得未知的运算过程,其本质在于对事物运作本质的数学抽象,是从初等数学到高等数学等内容的具体应用。在算法的发展历史上,“well-defined procedure”是人们一直在追求的目标,但直到20世纪的英国数学家图灵提出了“图灵机”,这一假象的计算模型后,这一问题方才得以解决。如今,算法已从早期为满足排序,检索等商业需求,扩展到机器学习,加解密,解压缩,数据分析等应用领域,“默默无闻”地满足着人们日常的各类需求。
三、算法的基本特征
-
有穷性(Finiteness)
算法的有穷性是指算法必须能在执行有限个步骤之后终止。 -
确切性(Definiteness)
算法的每一步骤必须有确切的定义。 -
输入项(Input)
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。 -
输出项(Output)
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。 -
可行性(Effectiveness)
算法中执行的任何计算步骤都可以被分解为基本的可执行操作步,即每个计算步都可以在有限的时间内完成(也程之为有效性)
四、算法的要素
- 数据对象的运算和操作
计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,称为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:
(1)算术运算:加、减、乘、除等运算。
(2)逻辑运算:或、且、非等运算。
(3)关系运算:大于、小于、等于、不等于等运算
(4)数据传输:输入、输出、赋值等运算。
- 算法的控制结构
一个算法的控制结构不仅仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。
五、怎么描述算法?
描述算法常用的有:
- 自然语言
- 机构化流程图
- 伪代码
- PAD图
其中最常用的是流程图
伪代码(Pseudocode):是一种算法描述语言。使用伪代码的目的是使被描述的算法可以很容易地以任何一种编程语言(Pascal、C、Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。伪代码介于自然语言与编程语言之间。
# 输入3个数,打印输出其中最大的数。可用如下的伪代码表示:
Begin(算法开始)
输入A,B,C
if A>B 则 A--> Max
否则 B --> Max
if C > Max z则 C --> Max
print Max
End (算法结束)
PAD图(problem analysis diagram, 问题分析图):是日本日立公司于1973年提出的一种算法描述工具,主要用于描述软件详细设计的图形表示工具。与方框图一样,PAD图也只能描述结构化程序允许使用的几种基本结果。自发明以来,已经得到一定程度的推广。它用二维树形机构的图表示程序的控制流,以PAD图为基础,遵循机械的走树(Tree Walk)规则就能方便地编写出程序,用这种图转换为程序代码比较容易。
六、与AI相关的算法
- 递推法
递推是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。 - 递归法
程序调用自身的编程技巧称为递归(recursion) - 穷举法
穷举法,又称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的的条件,从而得到问题的解。它也常用于对密码的破译,即将密码进行逐个推算直到找出真正的密码为止。