什么是算法读完这篇文章你就知道了

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

算法是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。

编程界的“Pascal之父”Nicklaus Wirth有一句人尽皆知的名言:“算法+数据结构=程序”,Algorithm+Data Structures=Programs,可见算法对程序的重要性。

本文从算法的基本定义出发,详细解读了算法的发展历程、主要特征、衡量指标和算法设计的基本方法,供大家学习参考。

1. 算法的基本定义

百科百科对算法的定义是:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

一句话概括一下,算法就是解决问题的操作步骤。

2. 算法的发展历程

在我国古代,算法被称为“演算法”,关于算法的起源最早可以追溯到我国古代公元前1世纪的《周髀算经》,是算经的十书之一,原名《周髀》,主要阐述古代中国的盖天说和四分历法。在唐朝的时候,此书被定为国子监算科的教材之一,并改名为《周髀算经》。《周髀算经》中记载了勾股定理、开平方问题、等差级数等问题,其中用到了相当复杂的分数算法和开平方算法等。在随后的发展中,出现了割圆术、秦九昭算法和剩余定理等一些经典算法。

在西方,算法(algorithm)一词最早来源于9世纪波斯数学家花拉子米(花拉子米是代数与算术的创立人,被誉为“代数之父”,所著《代数学》一书,最早给出了一次和二次方程的一般解法),花拉子米的拉丁文译名是“Algoritmi”,英文对“算法”原译为“algorism”,意思是花拉子米的运算法则,指的是用阿拉伯数字进行算术运算的过程,在18世纪演变为“algorithm”。

阿拉伯数学家花拉子米

世界上第一个算法

公元前300年,“几何之父”欧几里得提出了人类史上第一个算法——欧几里得算法,又称辗转相除法,是求最大公约数的一种方法。它的具体做法是: 用较大数除以较小数,再用出现的余数(第余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

辗转相除法举例:

求10,25的最大公约数:

25/10=2……5

10/5=2……0

所以10,25的最大公约数为5

辗转相除法代码实现:

世界上第一个算法程序

这张写满数学算法的巨幅图表,被视为“第一个计算机程序”,由埃达·洛夫莱斯编写, 发表于 1843 年的一篇关于“分析机” 的文章中。埃达对此给出精准描述如下:“这张表显示了运算过程中,机器各部分的所有连续变化。”

虽然这个算法未能实现,但Ada对计算机科学的贡献毋庸置疑,1953年,阿达之前对查尔斯·巴贝奇的《分析机概论》所留下的笔记被重新公布,并被公认对现代计算机与软件工程造成了重大影响。

“软件之母”Ada Lovelace

图灵机

20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。

图灵机,又称图灵计算机,是指一个抽象的机器,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。

它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

图灵机是可被视作任意解决有限数学逻辑过程的机器,可以用来模拟任何算法。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。

3. 算法的重要特征

一个算法应该具有以下五个重要的特征:

·有穷性(Finiteness)

算法的有穷性是指算法必须能在执行有限个步骤之后终止;

·确切性(Definiteness)

算法的每一步骤必须有确切的定义;

·输入项(Input)

一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

·输出项(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

·可行性(Effectiveness)

4.算法的评定

算法的复杂性是算法效率的度量,在评价算法性能时,复杂性是一个重要的依据。算法的复杂性的程度与运行该算法所需要的计算机资源的多少有关,所需要的资源越多,表明该算法的复杂性越高:所需要的资源越少,表明该算法的复杂性越低。

评定一个算法的优劣可以从以下5个方面进行衡量:

是对一个算法在运行过程中临时占用存储空间大小量度。

2)空间复杂度

程序运行时基本操作所执行的次数。

3)正确性

算法的正确性是评价一个算法优劣的最重要的标准。

4)可读性

算法的可读性是指一个算法可供人们阅读的容易程度。

5)鲁棒性

鲁棒性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。

5.算法设计和分析的基本方法:

1)递归和递推。递归和递推是学习算法设计的第一步。递归算法是把大问题分解成相对较小的问题的过程,而递推就是从小问题逐步推导出大问题的过程。无论递归还是递推,都应该有初始状态。

2)搜索、枚举及优化剪枝。搜索在所有算法中既是最简单也是最复杂的算法。说它简单,是因为算法本身并不复杂,实现容易:说它最复杂,是因为要对搜索的范围进行一定的控制,不然就会出现超时等问题。搜索技术主要包括广度优先搜索和深度优先搜索。当其余算法都无法对问题进行求解时,搜索或许是唯一可用的方法。搜索是对问题的解空间进行遍历的过程。有时问题解空间相当庞大,完全遍历解空间是不现实的,此时就必须充分发掘问题所包含的约束条件,在搜索过程中应用这些条件进行剪枝,从而减少搜索量。

3)分治法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题.....直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)......

4)动态规划法。动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

5)贪心算法(亦作饕餮法)。就是一种在每一步选择中都采取在当前状态下最好/优的选择,从而希望导致结果是最好!优的算法。贪心法可以解决一些最优性问题,如:求图中的最小生成树、求哈夫曼编码.....对于其他问题,贪心法般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。

THE END
0.《算法》世界5.低存储性:低存储性是指算法所需的存储空间小。对于像手机、平板电脑这样的嵌入式设备,算法如果占用空间过大,则无法运行。算法占用的空间大小被称为空间复杂度。 五.时间复杂性 在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:6364=2
1.软件设计师通俗易懂的去了解算法的特性和要求简介:【软件设计师】通俗易懂的去了解算法的特性和要求 🐓 算法 算法是对特定问题求解步骤的一种描述,算法是指令的有限序列。其中每一条指令表示一个或者多个操作。 🐓 算法的5种属性 有穷性 一个算法必须总是在执行有穷的步骤后,且在每个步骤执行的过程中时间是有限的 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1::374?2
2.算法的基本概念算法的五个特性第二章 算法的基本概念和算法的衡量 一.算法的特征 算法(Algorithm):是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。 算法具有以下五个特性 ①有穷性: 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 jvzquC41dnuh0lxfp0tfv8r2a9773?6541gsvrhng1jfvjnnu1755?::869
3.算法入门:定义描述特性和效率分析3.1算法的定义 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 简而言之,算法就是解决问题的方法和步骤。 3.2算法的描述 自然语言:英文、中文 流程图:传统流程图、NS流程图 伪代码:类语言:类C语言 jvzquC41dnuh0lxfp0tfv8vsa9924:6951gsvrhng1jfvjnnu1743@6537:
4.什么是算法及其特征一个算法应该具有以下五个重要的特征: 有穷性:一个算法必须保证执行有限步之后结束; 确切性:算法的每一步骤必须有确切的定义; 输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1;<:829
5.Algorithm算法: 是对特定问题求解步骤的一种描述,是为了解决一个或者一类问题给出的 一个确定的、有限长的操作序列。 算法的设计依赖于数据的存储结构,因此对确定的问题,应该需求子啊适宜的存储结构上设计出一种效率较高的算法 算法的特性: 有穷性: 对于任何一组合法的输入值,在执行有穷步骤之后一定能结束,即算法中的操jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1B:24:7
6.算法设计与分析(超详解!)第一节算法概述可以理解为:算法(algorithm)是指在解决问题时,按照某种机械的步骤一定可以得到问题的结果(有的问题有解,有的没有)的处理过程。算法就是解决这个问题的方法和步骤的描述。 2.算法的特征 有限性:一个算法必须保证执行有限步骤之后结束,即算法的每个步骤都能在有限的时间内完成。即算法的每个步骤都能在有限的时间内完jvzquC41dnuh0lxfp0tfv87423e88:675:=0c{ykenk0fnyckny03<;7699:;
7.算法的特性和空间复杂度数据结构算法的特性和空间复杂度---数据结构 前言: 在前面我们已经讲过时间复杂度了,空间复杂度也几乎是八九不离十,我们这节主要来讲讲一个好的算法需要满足什么样的特点。 1.算法 算法实际上就是一组一组的操作,在计算机上表现为一组指令,让计算机按照我们想要的逻辑进行运算,并能有效的解决实际问题。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:7676:1
8.入门必看算法基础知识讲解小白都也能看得懂大家好,我是小诚,国庆放假后跟一些小伙伴聊天时发现,大家潜意识里都知道想要进入大厂算法是必须过关的,所以很多人在学校就开始去刷题了,题目虽然刷了许多,但是对于学习算法的初衷和衡量一个算法的指标却是模糊的,所以,博主想写一篇关于学习算法的初衷和算法的指标,帮助准备学习算法或者初学算法的小伙伴将基础巩固。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1A:276<
9.算法算法概述算法inputoutput是对某问题求解步骤的的描述。有输入输出,可以解决某一问题。 二、特征 一个算法应该具有以下五个重要的特征: 有穷性(Finiteness)、确切性(Definiteness)、输入项(Input)、输出项(Output)、可行性(Effectiveness) 有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止。 jvzquC41dnuh0lxfp0tfv8|gkzooa=925693:8ftvkimg8igvcomu86262?349>
10.算法及其描述数据结构从上面的两个例子我们可以看出用 C/C++来描述的算法结构更清晰(编写的程序结构化更高,对 d的三种不同情况的处理一目了然)。 3、算法分析 在一个算法设计好后,还需要对其进行分析来确定一个算法的好坏。 算法设计的目标 正确性:要求算法能够正确地预先规定的功能和性能要求。这是最重要也是最基本的标准。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:7257;9
11.认识算法的特性简介:认识算法的特性 如果说数学是皇冠上的一颗明珠,那么算法就是这颗明珠上的光芒,算法让这颗明珠更加熠熠生辉,为科技进步和社会发展照亮了前进的路。数学是美学,算法是艺术。走进算法的人,才能体会它的无穷魅力。 多年来,我有一个梦想,希望每一位提到算法的人,不再立即紧皱眉头,脑海里闪现枯燥的公式、见长的代jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:648:8:
12.C语言从入门到精通第2章算法—自学笔记本文详细介绍了算法的基本概念,包括有穷性、确定性、可行性、输入和输出,并探讨了算法的优劣标准,如正确性、可读性、健壮性和时间复杂度。同时,讲解了算法的描述方法,如自然语言、流程图和N-S流程图,通过实例展示了如何用这些方法表示和分析算法。 前言 jvzquC41dnuh0lxfp0tfv8|gkzooa><2248948ftvkimg8igvcomu86495;4895
13.万字长文不学算法你也应该知道的算法知识三、算法的特性 当然一个问题都是可以由多个算法解决的。俗话说,无规矩不成方圆。 那么不同的算法是不是得有相同的规则,或者说相同的特性,才能约束算法,不能任意一种算法就可以解决问题。 打个比方,就用曹冲称象这个例子吧。为了不浪费大家的脑子,我决定就说的简单一点。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1A7;5;>
14.算法分析与设计算法概述  理解算法的概念。   掌握算法的计算复杂性概念。   掌握算法复杂性的渐近性态的数学表述。   了解NP类问题的基本概念。 二、算法的定义   顾名思义,计算(求解)的方法   算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:864873
15.算法分析与设计基础算法设计与分析该博客围绕算法展开,先介绍算法概念、特征、设计模式与描述方法,接着阐述算法效率分析基础,包括时间效率、操作类型、输入规模等。还详细讲解了蛮力法、减治法、分治法、变治法、动态规划和贪心法等常见算法策略,如欧几里得算法、选择排序、二分查找等。 一、绪论 jvzquC41dnuh0lxfp0tfv8vsa8884::461gsvrhng1jfvjnnu1747;>::3>
16.【算法】看《趣学算法》总结了一些算法常识,你不来了解一下遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现。 N.Wirth教授:数据结构+算法=程序。 企业:程序是指程序员以代码为工具,运用数据结构与算法开发系统,最终创造价值。 算法具有哪些特性呢? jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:637:>9
17.算法具有什么特征问答一个算法应该具有以下五个重要的特征:1、有穷性: 一个算法必须保证执行有限步之后结束;2、确切性:jvzquC41fg|fnxugt0gmk‚zp0eun1jxm13858>9
18.数据结构——算法数据算法如今普遍认可的对算法的定义是: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并旦每条指令表示一个或多个操作。 二、算法的特性 算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。 输入:算法具有零个或多个输入。所谓的零个输入是指算法本身有初始条件 jvzquC41dnuh0lxfp0tfv87523e92@9:7980c{ykenk0fnyckny03=78;7=79
19.Python算法Algorithm专栏导读清晰的问题定义:首先,确保你充分理解问题的本质和要求。清晰的问题定义将有助于你更好地思考和设计解决方案。 分析问题:在着手设计算法之前,对问题进行仔细的分析。了解问题的特点、约束和目标是关键。 选择合适的数据结构:选择正确的数据结构通常是设计优美算法的第一步。合适的数据结构可以显著影响算法的性能和可读性jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:868:<:
20.算法与算法分析一个算法必须具备以下五个重要特性: 有穷性一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 确定性算法中每一条指令必须有确切的含义,没有二义性,在任何条件下只有唯一的一条执行路径,即对相同的输入只能得到相同的输出。 可行性算法是可执行的,算法描述的操作可以通过已经实现的基本操作执jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1A:;648
21.数据结构学习记录算法最简单的描述算法的方法是使用自然语言,用自然语言来描述算法的优点是简单且便于人们对算法的理解和阅读,缺点是不够严谨,易产生歧义。当算法比较复杂且包含很多转移分支时,用自然语言描述就不是那么直观清晰了。 2 算法框图法 使用程序流程图、盒图等算法描述工具来描述算法。其特点是简洁明了、便于理解和交流。 jvzquC41dnuh0lxfp0tfv8ojdw0c{ykenk0fnyckny03=:52;91;
22.干货数据结构与算法什么是算法在现代,最普遍认可的算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 其实这个也很好理解,就是为了解决某个问题,把一些指令按照顺序排起来,完成一些操作,这就是算法。 算法的特性 说到算法的特征,一般来说公认的有五大基本特征,即:输入,输出,有穷jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1A>493: