原来你是这样的算法


640?wx_fmt=gif

640?wx_fmt=png

什么是算法?

“你好,机器人,请给我解释一下什么是算法。”

“好的。但与此同时,我还会告诉你算法、计算机和程序之间的联系。”

“我知道。当我们找到一种算法时,需要将它写成程序的形式,而我们对计算机的要求也不只是单纯地为我们工作。”

“完全正确。”

“有了算法,一切皆有可能吗?”

“并非如此……但是,无限的可能或许就是算法极具魅力的原因吧。”

想理解什么是算法,我们要先设想一个场景。


几千年前,一位祖先凭着他对已故祖母如何做面包的记忆,尝试自己做面包。但是,他真的不知道该怎么做。他犹豫着,一开始先将麦仁放入沸水中,然后对自己说,这也许是个糟糕的想法。这位祖先的困境,正是我们都会面临的情况——遇到某一个问题,却又不知道该如何解决。我们想着解决方法,去尝试,反复探索实验,顺便有了一点点意外发现,直至成功……或者失败。


然而,真正的面包师并不是这样做的。他们不会给每炉面包都重制一个烘焙食谱,因为他们已经掌握并牢记了面包的烘焙方法。多亏了面包食谱,面包师可以每天给我们提供面包。事实上,人类文明的发展不仅源于有些人的发明创造,也因为另有人“复制”了这些发明,才使其得以改进。


但是,我们忘却了面包食谱的宝贵之处。首先,食谱降低了不确定性:多亏了它,面包师知道,除非突遭一场灾难,否则面包将会在晚餐时准备好。有了这个食谱,不需要什么想象力或是天赋,任何人都可以做面包。就拿两位作者来说,我们对面包烘焙没有任何天赋,但仍可以从网页上找到恰巴提的食谱,运用适当的和面力度,借助更富有想象力和才华的面包师们写下的方法,做出面包。最终,这个食谱成为了人类遗产中的一部分,在几千年的历史长河中,代代相传。


食谱就是一个算法,我们就此有了“算法”概念的初步定义:一个算法是解决一个问题的进程。我们并不需要每次都发明一个解决方案。

从这个定义不难看出,自人类历史初期,我们就一直在发明、使用和传播着各种各样的“算法”,用来烹饪、雕琢石器、钓鱼、种植扁豆及小麦,等等。


进程和符号

有些算法与面包食谱不同,它们能解决书写符号的问题,例如数字、字母等。算法汇集在一起,形成蕴含不同含义的数目、词语、句子及文本。


例如,二分查找算法的用途是在字典中搜索某个特定词。二分查找法从字典中间开始查找,对比目标词与中间词的位置,根据目标词位于中间词的前或后,来选择字典的前半部分或后半部分作为新字典,然后再用二分查找法继续查找,以此类推,直到找到目标词为止。这一算法解决涉及一种书写符号——字母的问题。还有一些算法可以实现加法、减法等,解决涉及另一种书写符号——数字的问题。这类算法被称为“符号算法”。


计算机科学家往往将“算法”一词的含义限定为此类“符号算法”。考虑到这种限制,自然,我们就不能将算法的历史追溯到文字发明之前了。然而,广义上的算法概念其实与文字同样古老。从迄今人类所发现的最古老的书面踪迹表明,古代书吏已经开始使用算法了,例如用于记账的加法和乘法。文字可能就是因此而发明的。


算法和数学

数学家们从很早便开始关注算法的设计了。比如,大约公元前 300 年的欧几里得算法可以计算两个整数的最大公约数。我们简单说明一下。读者若是在攀登数学高峰时感到吃力,大可以直接跳过这一段,或把以下内容当作一首深奥的诗,尽量去理解。


一般来说,一个算法会在输入端接收数据,这些数据构成了算法的参数。在欧几里得算法中,输入数据就是两个不为零的整数,设为 a 和 b,且 a 大于 b,例如 a 等于 471,b 等于 90。通常,算法会在输出端返回另一些数据。在欧几里得算法中,输出数据是一个整数,即 a 和 b 的最大公约数。


将欧几里得算法应用在整数 471 和 90 上,即有:


欧几里得算法应用在整数 471 和 90 上

640?wx_fmt=png 640?wx_fmt=png

在上述例子中,算法的每一步都需要计算 a 除以 b 的余数 r,随后用被除数 b 替代除数 a,余数 r 替代被除数 b。因此,由 471 = 5 × 9 + 21 可知,471 除以 90 的余数为 21。在第一步中,第一个数 471 被 90 替代,而第二个数 90 则被余数 21 替代,以此类推。但有一个例外:当余数为 0 时,就停止计算,且数 b 即为最终结果。这种情况出现在上述例子中的最后一步:我们用 6 除以 3,余数为 0,那么 3 即为所求。


算法也是中世纪西方数学家所关注的核心问题。数学家们引进了印度 - 阿拉伯数字,以及与这种数字系统配套的算法。其中一本著作是通晓阿拉伯语的波斯数学家穆罕默德 · 穆萨 · 花拉子米在 9 世纪撰写的《印度计算法》(Algoritmi de numero indorum)一书。“花拉子米”(al-Khuwārizmī)一名源自作者的出生地花剌子模地区,今属乌兹别克斯坦。有文献证明,自 1230 年起,花拉子米这个名字就成了“算法”(algorithm)一词的来源。



用语言来表达

算法会自然而然地运用到与数学有关的对象上。


其实,人类的一切活动中都有算法的身影,算法概念涉及到方方面面。但我们要先解决一个关键问题:如何描述算法?



640?wx_fmt=gif

分析分析

640?wx_fmt=gif


如何描述算法?



假设我们想从巴纽火车站到达位于卡尚镇的巴黎萨克雷高等师范学院。几十个学生和教师每天早上都走同一条道路:首先沿着杜邦皇家大道走,接着是布里昂城堡大道。在不知不觉中,他们可能就用到了算法——一种从火车站到校园的程序。


谷歌地图提供了这个算法的图形形式:


640?wx_fmt=png


同时也有一个文本形式:


640?wx_fmt=png


如果我们给一个大学生解释这个算法,用一个简明扼要的方式就能表达清楚,但如果要给一个小孩子解释,就需要更详尽的细节。因此,讲解算法的方式是一个社会学问题,取决于谈话对象和谈话对象拥有的常识水平。


同样,欧几里得算法也可以用文字形式表达:


640?wx_fmt=png


维基百科又提供了一种图形表达式:


640?wx_fmt=png

所以,一种算法可以有不同的语言表达形式。然而,有一种表达形式不依赖于语言。一名学生没睡醒就去了校园,走起路来晃晃荡荡,就像在梦游,他运行的这个随机算法没有任何语言表述。还有一个例子能更好地说明这一令人困惑的现象。蚂蚁寻找食物时,使用了非常复杂的算法,在空间里进行定向。侦察蚁开始随机浏览蚁穴四周。当其中一只蚂蚁发现食物的时候,便会在返回自己蚁群的一路上留下跟踪信息素。受到跟踪信息素的指引,其他路过此区域的蚂蚁会沿着这条路径前行。当蚂蚁带着食物返回蚁穴时,也会一路留下自己的跟踪信息素,以增强轨迹信息。


如果有两条路径都能到达同一个食物源,那么在同一时间内,沿最短路径行走的蚂蚁往返蚁穴与食物之间的次数将比沿着长路径走的蚂蚁更多。于是,前者也会留下更多的跟踪信息素。这时,最短路径的信息将会更强,也越来越具有吸引力。跟踪信息素是有挥发性的,如此一来,被冷落的最长路径最终会消失。

蚁群利用一个复杂的算法确定了最短路径。早在蚁学家用语言记下这种现象之前,蚂蚁就很好地运用了这个进程。


确切地说,人与蚂蚁之间的区别在于,我们会尝试用语言表达、存储、传输、理解和改进算法。然而,我们有时也会用到不知该如何用语言表达的算法。比如,我们很容易就能辨认出猫和狗,却难以解释是如何做到的:是计算腿和耳朵的数量呢?还是观察头的形状或毛发的纹理呢?


我们的大脑和身体会用很多算法来思考、运动、做事,但不管是符号算法,还是其他算法,我们并不总知道如何解释。


指令序列之外

从巴纽火车站到高等师范学院的算法可以表示成一个包含四个基本动作的逻辑序列:“取道东南方,向上朝着兰斯街的杜邦皇家大道”“然后……”“接着……”“再然后……”。欧几里得算法表达式中也出现了一些基本指令,比如赋值:“用 b 替代 a”。此外还有将这些指令封装成逻辑序列的句法结构,比如“这样做,然后那样做”,以及循环体,比如“当某条件为真时,重复此操作”。我们还可以添加条件测试语句:“如果此条件为真,那么这样做。”


这种方式听起来有点不寻常。事实上,只要很少的句法结构,就足以表达所有的符号算法,例如上述四个句法结构:赋值、逻辑序列、循环体、条件测试语句。算法的宝贵之处并不在于其组成有多么复杂,而恰恰在于这种将几个简单成分封装在一起的方式。


这就好比化学分子:数十亿个化学分子组成了我们所熟知的几十种化学元素;而这些化学元素本身仅由三种基本粒子——质子、中子和电子组成。


然而,尽管构建算法的基本元素在理论上非常充足,人们却很少从头开始构建算法:算法往往由其他一些已知的算法构成。例如,我们用算法描述了从巴纽地铁快线站到高等师范学院的路线。如果我们现在想从卢森堡公园到达校园的话,那么一个简单的算法就是:先乘坐地铁快线从卢森堡站到巴纽站,然后再运用先前的算法——这个算法被看成是一个整体。此时,一个全新的算法就这样形成了。我们并不清楚先前算法的细节,而是把它视为一个新的基本指令。



算法和数据,算法的方法,以及机器学习这三个内容请扫描免费阅读


640?wx_fmt=jpeg 640?wx_fmt=jpeg


好书推荐:


《算法小时代:从数学到生活的历变》


可扫码查看本书完整内容,感谢对作者的支持~


640?wx_fmt=png


“ 算法小时代 ”

从数学到生活的历变


作者简介

瑟格 · 阿比特博(Serge Abiteboul)数据科学、信息与数据管理和有限模型论专家,计算机协会院士,法兰西科学院院士,法国国家计算机与自动化研究所学者,被美国科技信息所评为“高引用科学家”。曾荣获英国皇家学会“米尔纳奖”、国际计算机学会数据管理专业组织(ACM SIGMOD)“埃德加 · 科德”创新奖和 Test of Time 奖。


吉尔 · 多维克(Gilles Dowek),数学家、逻辑学家和计算机科学家,法国国家计算机与自动化研究所机器证明处理系统、编程语言、航空系统安全专家,巴黎高等师范学院教授,美国国家航空研究院顾问。曾荣获法国数学学会“达朗贝尔奖”,其数学科普名作《计算进化史》荣获法兰西学术院哲学大奖。



求关注~

求转发~

640?wx_fmt=jpeg


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值