历史上的第一个算法,竟然至今还能用!图灵机编程计算机

算法历史上的每一个“第一次”,都为计算机的发展带来了重大影响。那算法为什么是计算机程序的灵魂?其实可以从它的发展史中略窥一二。

异步君将带领大家从算法的每个“第一次”开始,了解“好”算法的性质,还会送给大家一些算法的基础学习方法!

1

算法的每一个“第一次”

算法概念的第一次被提出

自古老的公元前1世纪开始,《周髀算经》就作为中国最古老的天文学和数学著作,在算法的历史上写下了浓墨重彩的一笔。

作为算经的十书之一,《周髀算经》采用最简便可行的方法确定天文历法,揭示日月星辰的运行规律,囊括四季更替,气候变化,包涵南北有极,昼夜相推的道理。为后来者的生活作息提供了有力保障。

经过几个世纪的发展,到公元9世纪,波斯数学家al-Khwarizmi第一次在数学上提出了“算法”这个概念——演算法(algorithm)。他提出的算法概念,仍旧沿用至今:

1.算术运算

指按照规定的法则和顺序对式题或算式进行运算,并求出结果的过程。包括:加法、减法、乘法、除法、乘方、开方等几种运算形式。

运算和计算略有区别,计算是指把横式中的数按运算符号和规定的顺序求得结果,可以按运算法则,也可以按口算或其他简便的方式直接求得结果。而运算则是指求得结果的过程。

2.关系运算

关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),有些查询需要几个基本运算的组合,要经过若干步骤才能完成。

3.逻辑运算

逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律。这一逻辑理论人们常称它为布尔代数。

历史上第一个算法

公元前330年,被人们称为“几何之父”的欧几里得出生了。在欧几里得生活的那个时期,几何学存在一个很大的缺点和不足,就是缺乏系统性。

这一时期的古希腊几何学,大多数是片断、零碎的知识,公理与公理之间、证明与证明之间并没有什么很强的联系性,更不要说对公式和定理进行严格的逻辑论证和说明。

于是欧几里得下定决心,要在有生之年完成对几何学的系统化理论化。由此,经过无数个日夜的撰写,人类史上第一个算法——欧几里得算法诞生了!

对现在的计算机行业来说,欧几里得算法是目前最经典的几大算法之一。

历史上的第一个算法程序

19世纪80年代,“软件之母”AdaByron为巴贝奇分析机编写了求解伯努利方程的程序。这是人类史上的第一个算法程序。

巴贝奇分析机

Ada关于算法的研究实现了计算机科学的本质性飞跃。在她去世一百年之后的1953年,她之前所翻译《分析机概论》留下的笔记被重新公布,再一次震惊了世人。人们因此认为,Ada对现代计算机与软件工程造成了重大影响。

从现在的观点来看,Ada首先为了计算制作了“算法”,然后制作了“程序设计流程图”,这个珍贵的计划被认为是“第一件计算机程序”。

“软件之母”AdaByron

作为世界上的第一位程序员,Ada为编程的发展做出了极大的贡献。

第一次解决算法定义的难题

进入20世纪,算法得到了进一步的巨大发展。这个世纪,英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。

图灵机的构造

所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色,有一个机器头在纸带上移来移去。

机器头有一组内部状态,还有一些固定的程序。每个时刻,机器头都要从纸带上读入一个方格信息,然后结合内部状态查找程序表,再根据程序输出信息到纸带方格上,并转换自己的内部状态进行移动。

虽然图灵机十分地简单,但它可以用来模拟任何算法。图灵机对人们使用纸笔进行数学计算的过程进行了抽象,实现了用机器代替人类进行数学计算。图灵机的出现,解决了算法定义的难题。

算法是计算机程序的灵魂,掌握了算法,就可以离开发出优秀的程序更近一步。

2

“算法+数据结构=程序”

说到算法与编程的关系,异步君就必须向大家介绍一位传奇人物:NicklausWirth。

作为编程界的“Pascal之父”,NicklausWirth有一句在计算机领域人尽皆知的名言:“算法+数据结构=程序”。

凭借着这句名言,NicklausWirth在1984年拿到了图灵奖的奖项。因为这个公式对计算机科学的影响程度,足以类似物理学中爱因斯坦的“E=MC^2”——仅用一个公式就展示了程序的本质。

NicklausWirth

NicklausWirth于1934年在瑞士北部的温特图尔出生,其父瓦尔特是一位地理学教授。Wirth小时候就喜欢动手动脑,他的最大爱好就是组装飞机模型。

1960年,在加拿大莱维大学深造的Wirth获得了硕士学位。取得硕士学位的他并不满足,随后便进入加州大学伯克利分校,于1963年获得博士学位。

在斯坦福大学成功的开发出AlgolW以及PL360后,爱国心极强的NicklausWirth于1967年回到祖国瑞士,第二年在他的母校苏黎世工学院,他创建与实现了Pascal语言——当时世界上最受欢迎的语言之一。

Pascal语言算得上是一种经典的算法语言。而算法的主要目的在于为人们提供阅读了解所执行的工作流程与步骤。那么,什么样的算法才算是“好”的算法?异步君在这里提炼了几个性质:

(1)正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。

(2)易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。

(3)健壮性:算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,系统应该提示出错。

好的算法,可以让我们开发程序达到事半功倍的效果。那么我们应该如何学好算法呢?

3

如何学好算法

随着科技的发展,算法已经逐渐渗透在各行业内,是一个有着优秀前景的专业领域。

怎样学好算法?异步君在这里为大家准备了一些学习算法的入门路径:

算法工程师必备技能

1.至少懂一门语言:C/C++/java/python/R;

2.熟练运用各种常用算法和数据结构,有独立的实现能力;

3.熟悉数据挖掘算法;

加分项:具有较为丰富的项目实践经验。

大家看到这里,肯定带一个疑惑:是应该直接学习算法吗?

万丈高楼平地起,任何高深的算法都要从基础算法学起,不可能一口吃个胖子。

所以,初入门的你学习算法还是要从基础开始:

算法的基础学习步骤

1.首先学习一门语言

例如C/C++/Java/python,初学者学C++比较普遍。

2.学数据结构

数据结构书有很多,但是有些教材晦涩难懂,建议看图解多,通俗易懂的书,推荐《趣学数据结构》。

3.学算法

不要直接看《算法导论》,大量证明会让你崩溃。

推荐《趣学算法》,有问题分析,完美图解,伪码详解,实战演练,适合初学者快速掌握经典算法。

程序的灵魂是算法。软件开发中,选择算法可以更快更好地实现功能。因此,程序员唯有掌握算法,才能轻松地驾驭程序开发。

THE END
1.算法笔记(三)算法学习技巧1.如何总结各个算法? 首先找出各个算法自己的主要特性,拿出来之后去和其它算法比较,时间复杂度和空间复杂度相互比较,这是建立知识之间联系的一个过程,其次,也要拿出他们的共同点、共同之处,使他们联系更紧密。 2.三遍读书方法? 第一遍快速阅读一遍(在n+1)基础之上,第一遍是为了了解全书内容,让自己有一个把握,https://www.code456.com/article/3598351.html
2.从啥也不会的小白,如何成为合格的算法工程师?算法工程师之前有一个小伙伴在留言当中问我,说自己想要从事算法工程师的工作,但是不知道应该从哪里入手,请问我应该怎么办。 这其实是一个老生常谈的话题,也是一个很大的概念。我很难用三言两语告诉你究竟应该如何做,但我可以告诉你一个合格的算法工程师应该至少需要具备什么样的能力,也许可以帮助你们找到前进的方向。 基础 https://aiqicha.baidu.com/qifuknowledge/detail?id=10100085880
3.人工智能算法的分类与应用人工智能 (AI) 是当前科技领域的热门话题,其核心是各种算法的灵活运用。AI算法不仅实现了智能预测、分类,还在数据挖掘、自然语言处理和推荐系统等领域发挥着重要作用。接下来,我们将以科普的视角,带您深入了解 AI 的主要算法及其广泛应用。 一、监督学习 https://mp.weixin.qq.com/s?__biz=MzI3MzQ1NjMwOA==&mid=2247549220&idx=4&sn=25aa18da4b1e2824371e552b0ca3c8e6&chksm=eb214cffdc56c5e9303367ae4087102996613151dfa3c11fafe88950b683dbc8dadedd63bcaa&scene=27
4.我是如何成为算法工程师的,超详细的学习路线如果时间充裕,推荐先学好数学基础。如果时间不够,那就跳过数学基础部分,学算法的时候,哪里不会补哪里。 2、编程能力 编程语言,需要至少掌握两门, Python 和 C++。 工作中,Python 主要用于处理数据、算法调研、模型训练的工作,而 C++ 则是负责工程落地。 https://blog.csdn.net/qq_29462849/article/details/118159648
5.C语言数据结构的时间复杂度和空间复杂度C语言2.什么是算法? 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果通俗来说:二分查找,冒泡排序等等都为算法 3.如何学好算法和数据结构 https://www.jb51.net/article/280489.htm
6.北师大二年级数学下册教学计划(精选15篇)二、加强估算,鼓励算法多样化 估算在日常生活中有着十分泛的应用,在本册教学中,教师要不失时机地培养学生的估计意识和初步的估算能力。例如:在估计一筒花生在多少粒;估计一篇文章有多少字;进行万以内加减法计算时,先估计得数的大致范围再进行计算;在学习测量时,先估计测量的物体有多长,再实际测量。这样做,有利于学https://www.unjs.com/jiaoxuejihua/202102/3169309.html
7.即将到来的算法革命,让孩子学好数学迟早有一天,我们将通过计算解决一切问题。如果投资这件事指的是投资未来,那么从现在开始关注一切和算法相关的事情就并不为过,至少,你可以让孩子在一个新的意义上学好数学。语言是社交的工具,算法则是他和机器打交道的工具。 AI,也就是人工智能,以算法为基础。看一个有趣的报道,法国圣母大学的研究人员最近开发出https://laoyaoba.com/html/share/news/619312?source=app_android_v2
8.《算法与数据结构》精品课:线上线下融合,师生协力共创编程教学新(更多博客推文可关注公众号“SIST算法与数据结构”或访问课程主页https://smart.sist.shanghaitech.edu.cn/cs101/进行查看) 学好这门课的秘诀? 学好一门课程,需要脚踏实地进行学习与反思,没有捷径可走。但是有一些学习建议,可以帮助同学们更好地学习和理解这门课程。 https://sist.shanghaitech.edu.cn/_t335/2023/1205/c2858a1086548/page.htm
9.算法岗还是工程岗?关于职业选择的一点小思考职业发展以机器学习平台研发工程师-Data进行举例,首先你至少要精通或者熟悉一门编程语言(重点,不要贪杯),其次就是数据结构与算法要学好(这里所谓的学好并不是说你在某某平台刷了多少题,更重要的是要了解算法在生活中的应用场景,比如对于栈这种数据结构,大家在学校里可能就只知道栈可以解决括号匹配问题,但你是否知道你在日常https://ac.nowcoder.com/discuss/995242?type=9&order=0&page=1
10.算法简单学习(一)——前言如何学习算法 算法的学习是一个循序渐进的过程,这主要有两个方面的因素。 其一是计算机相关基础知识是否扎实。 其二是思维逻辑的强化和算法实践需要时间。 如果要学习算法,找到合适的书籍是很重要的,比较推荐算法导论这本书,下面会给出这本书的链接大家可以买或者在网上找电子免费版。 https://www.jianshu.com/p/f74f4ef33e93
11.编程竞赛宝典C++语言和算法入门首先,算法(Algorithm)一词源于算术(Algorism),具体地说,算法是一个由已知推求未知的运算过程。后来,人们把它推广到一般过程,即把进行某一工作的方法和步骤称为算法。一个程序要完成一个任务,其背后大多会涉及算法的实现,算法的优劣直接决定了程序的优劣。因此,算法是程序的“灵魂”。学好了算法,就能够设计出更加优异https://www.epubit.com/bookDetails?id=UB77a9ce8133887
12.“一个人连基本的算法都掌握不了,他肯定成不了优秀的程序员优秀的小伙伴都知道,学好算法与数据结构, 不单单是为了应付技术面试的需要,更重要是提升自身编程水平。 那么程序员到底需不需要精通算法呢? 首先,一个出色的程序员并不一定要精通算法,毕竟发展的方向很多。 但是,一个人连基本的算法都掌握不了,他肯定成不了优秀的程序员。 https://www.imooc.com/article/details/id/254516
13.代码随想录——跟着Carl学算法图书1.1 面试官为什么要考查算法 1 1.2 编程语言 2 1.2.1 学好算法之前更要学好编程语言 2 1.2.2 代码规范 2 1.3 如何写简历 5 1.3.1 简历模板 5 1.3.2 谨慎使用“精通” 5 1.3.3 拿不准的内容绝对不要写在简历上 5 1.3.4 项目经验应该如何写 6 http://www.broadview.com.cn/book/6500
14.算法分析入门教程实战篇及应用篇没错。要学好算法分析,必须要有一个好习惯。否则事倍功半。学破解的好习惯(也是做CRACK ME 的好习惯): 1.坚持独立完成破解(CRACK ME)。贵在坚持。开始时很吃力,成果也不明显。没关系。万事开头难,坚持。 2.独立地查找相关资料并研读,弥补自己的弱项。案头常备基础破解教材查询是绝大多数破解高手的好习惯。很https://www.pediy.com/kssd/pediy10/59537.html
15.代码随想录——跟着Carl学算法先后在腾讯和百度从事技术研发工作多年,对数据结构和算法有深刻理解。CSDN博客专家,各大OJ刷题总计过千题。公众号:代码随想录,目前有8w+垂直程序员粉丝。 章 准备面试要知己知彼 1.1 面试官为什么要考查算法 1.2 编程语言 1.2.1 学好算法之前更要学好编程语言 1.2.2 代码规范 1.3 如何写简历 1.3.1 简历模板 http://www.96192.com/product/detail/900082
16.labuladong的算法小抄(豆瓣)第1章列举了几个最常见的算法类型及对应的解题框架思路,包括动态规划、回溯、广度优先搜索及双指针、滑动窗口等算法技巧。 第2章用动态规划的通用思路框架解决了十几道经典的动态规划问题,例如,正则表达式、背包问题,同时还介绍了如何写状态转移方程、如何进行状态压缩等技巧。 第3章介绍了数据结构相关的算法,例如,二https://book.douban.com/subject/35252621/