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

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

首页

好书

留言交流

下载APP

联系客服

2023.01.12北京

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

编程界的“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.史上最简单十大排序算法(Python实现)python排序算法十大排序算法(Python实现) 一.算法介绍及相关概念解读 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界https://blog.csdn.net/weixin_41571493/article/details/81875088
2.算法设计实现(精选十篇)算法设计实现 篇1 现代空间遥感技术的发展已经使传感器的空间分辨率、光谱分辨率和时间分辨率大幅度提高, 使得遥感图像的数据量大增, 有的影像文件大小甚至达到GB级[1], 与此同时, 人们对遥感影像的处理和从影像获取信息的速度却远远落后于影像数据的增长速度, 其原因主要有以下两点: (1) 遥感影像数据量过大, 所https://www.360wenmi.com/f/cnkey3ax105m.html
3.算法:C语言实现(豆瓣)《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,选择排序、插入排序、冒泡排序、希尔排序、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基https://book.douban.com/subject/4065258/
4.算法的乐趣算法设计也离不开分支和跳转结构,根据对条件的判断,选择合适的处理步骤,是算法实现过程中常用的逻辑。分支和跳转结构算法设计的关键是设计分支条件和算法的跳转流程,一般一个分支条件对应一个处理流程。算法在执行的过程中,根据构造的分支条件进行判断,根据判断的结果转入相应的处理流程继续执行。 根据跳转分支的个数,https://www.ituring.com.cn/book/tupubarticle/5656
5.YOLO系列算法:从yolov1至yolov4的进阶之路(2万字超全整理,建议码BN算法实现: 在卷积或池化之后,激活函数之前,对每个数据输出进行标准化,实现方式如下图所示: 如上图所示,前三行是对Batch进行数据归一化(如果一个Batch中有训练集每个数据,那么同一Batch内数据近似代表了整体训练数据),第四行引入了附加参数 γ和β,这两个参数的具体取值可以参考上面提到的 Batch Normalization 这篇https://www.flyai.com/article/778
6.图的基本算法及其C语言的实现BFS是“一圈一圈往外找”的算法,借助了“循环队列”来实现: voidbfs(AdjListGraph*graph,intstartVertexIndex,bool visit[]){// Loop queue initialization.LoopQueue loopQ;loopQ.front=0;loopQ.rear=0;LoopQueue*loopQueue=&loopQ;enqueue(loopQueue,&(graph->adjList[startVertexIndex]));printf("%c ",https://www.jianshu.com/p/2e82d824c6ea
7.操作系统银行家算法模拟实现(C语言版)51CTO博客(3).银行家算法bank():进行银行家算法模拟实现的模块 (4).显示当前状态show():显示当前资源分配详细情况 (5).主程序main():逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行 四、实验代码 #include<stdio.h> #include<stdlib.h> https://blog.51cto.com/u_15467780/4853379
8.C++实现图的遍历算法(DFS,BFS)的示例代码C语言本文给大家带来的是图遍历的算法,DFS(深度优先遍历),BFS(广度优先遍历)。这两个算法是比较重要和常用的算法,但是在图中的实现只是最基本的操作,快跟随小编一起学习一下吧+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】图的定义图由顶点集V(G)和https://www.jb51.net/article/256666.htm
9.2020届计算机科学方向毕业设计(论文)阶段性汇报其中卷积算子通常使用通用矩阵乘算法及其衍生算法实现。本研究基于快速傅里叶变换算法,将原本时域上的卷积变为频域上的乘法操作,从而以较低计算复杂度的方式实现卷积算子。对于其他算子,推导频域上的等价表达并实现。同时结合傅里叶变换的线性性和卷积定理的推论,将整个网络的算子在频域空间中进行计算,达到降低计算量,https://zhiyuan.sjtu.edu.cn/html/zhiyuan/announcement_view.php?id=3709
10.深入理解JVM垃圾收集机制(JDK1.8)腾讯云开发者社区在新生代,每次垃圾收集时都发现大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率较高,没有额外的空间对它进行分配担保,就必须使用”标记-清理“和”标记-整理“算法来进行回收。 HotSpot算法实现https://cloud.tencent.com/developer/article/1069187
11.他们用了什么“手段”让6万项成果完成精准匹配新闻频道智能算法实现有效过滤 通过每年近千项成果的进场交易,知交中心非常清晰地了解到交易热点和行情,并逐步积累评判转化价值的实战经验。 “多年服务高校院所科技成果转化的工作经验,为我们和浙江大学技术转移中心进行合作打下了基础。”陈乐平告诉科技日报记者,双方凭借各自的技术经验,以产业政策、专利数据、需求数据和交易数据https://news.cctv.com/2019/03/28/ARTIEpUIZ35x2G9JfMOdcZqm190328.shtml
12.科学网—高等工程数学:工程问题解决方案的数学基础5.6 模拟退火算法 179 5.6.1 受热金属物体分子状态分布 179 5.6.2 基本模拟退火算法 181 5.6.3 模拟退火算法实现技术 181 5.7 遗传算法 183 5.7.1 基本遗传算法 183 5.7.2 遗传算法实现技术 184 第5章 习题 188 第6章 函数逼近与数据拟合 190 https://blog.sciencenet.cn/blog-528739-1193311.html