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

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

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

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

1.算法的基本定义

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

2.算法的发展历程

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

阿拉伯数学家花拉子米

世界上第一个算法

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

辗转相除法举例:

求10,25的最大公约数:

25/10=2……5

10/5=2……0

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

辗转相除法代码实现:

世界上第一个算法程序

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

“软件之母”AdaLovelace

图灵机

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

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

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

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

3.算法的重要特征

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

·有穷性(Finiteness)

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

·确切性(Definiteness)

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

·输入项(Input)

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

·输出项(Output)

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

·可行性(Effectiveness)

4.算法的评定

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

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

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

2)空间复杂度

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

3)正确性

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

4)可读性

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

5)鲁棒性

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

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

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

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

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

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

THE END
1.递归,搜索,和回溯算法腾讯云开发者社区大家也看到了,我们这个算法篇章的开头就比较长,这主要是因为他们三者关系紧密。 一、什么是递归: 我们在学习C语言和数据结构二叉树部分是就接触了大量的递归。 递归:简单来说就是自己调用自己 。 二、为什么要用到递归 我们先来简单的介绍一下三个用到递归的算法例子,来看看他们有什么共同点 https://cloud.tencent.com/developer/article/2477481
2.经典例题向Java程序员诠释递归,这样的算法公式你们必须懂可以看到,递归写法简单优美,省去考虑很多边界条件的时间。当然,递归算法会保存很多的临时数据,类似于堆栈的过程,如果栈深太深,就会造成内存用尽,程序崩溃的现象。Java为每个线程分配了栈大小,如果栈大小溢出,就会报错,这时候还是选择递推好一点。 观察下面的执行过程也会发现,本程序并没有保存每次的运算结果,第三行的https://maimai.cn/article/detail?fid=1699998565&efid=XrVS821Hh8PpVU3XNWFdPQ
3.java递归是什么意思,怎么用【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。 【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。 【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递https://www.itcast.cn/news/20190718/17592586079.shtml
4.算法笔记递归的理解3. 存在递归终止条件 把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。 总之:写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。 递归代码要警惕堆栈溢出 为什么递归代https://zhuanlan.zhihu.com/p/603180087
5.填充算法(一)递归填充算法51CTO博客(4)注: 上述两个算法实现理论上是没有错误的,但是在实际环境下,却会运行中断,具体原因是因为当递归深度过深时,栈溢出;而由递归深度引起的栈溢出(Stack overflow)是无解的(递归深度无法确定,栈大小修改不便),除非不用递归算法。附:修改工程栈大小: https://blog.51cto.com/u_7174271/6725361
6.什么叫递归,递归有哪些优缺点?递归的优缺点什么叫递归,递归有哪些优缺点? 在Web前端开发中,递归是一种算法或函数调用自身的过程。简而言之,递归是通过将问题分解为更小的子问题来解决问题的方法。递归在前端开发中常用于处理具有嵌套结构的数据,如树或多级列表。 让我们详细讨论递归的优点和缺点:https://blog.csdn.net/zy1992As/article/details/131680404
7.牟春花算法物化集体法律责任与分布式法律责任:规制算法的三重算法是什么? 学界对算法的定义有狭义、中义和广义三种。狭义的算法指的是“一组逐步执行的指令,通过机械的方式实施,以之达到某种预期的效果”。狭义的算法基本上局限在数学递归和数值计算范围内。随着现代计算机技术的出现,算法逐渐从纯粹数学迭代和递归计算转向计算机硬件物化和代码程序编程技术支持,出现了中观意义上的算https://www.jfdaily.com/sgh/detail?id=924830
8.时间复杂度分析,这个很多人都不知道,更别谈会了!递归算法的时间复杂度又该如何计算? 很多算法都是基于递归思想的,我们分析这些递归算法,可以得到关于时间复杂度的递归关系式。比如「归并排序」的时间复杂度一般表示为 ,还有二分查找,汉诺塔问题等等,但是关于递归的时间复杂度并不简单。 对于递归的时间复杂度的计算主要有三种方式:https://www.scholat.com/teamwork/showPostMessage.html?id=9254
9.数据结构与算法思维导图算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 1 算法的复杂度 1.1大O复杂度表示法 公式: 1 T(n)表示代码执行的时间; n表示数据规模的大小; f(n) 表示每行代码执行的次数总和。因为这是一个公式, 所以用f(n)来表示。公式中的O,表示代码的执行时间https://www.jianshu.com/p/b2761d11aa2b