未来世界,人类的生活不过是种种算法?( 三 )


算法和数据能够解决符号信息问题的算法,更注重这些符号信息的呈现方式 。例如,为了更好地执行加减乘除运算的算法,用阿拉伯数字形式的算式123 × 456,比写成罗马数字的算式CXXIII × CDLVI 更好 。同样,在字典中查找单词,用字母表查找比用象形文字查找更简单 。
寻找从一个点到另一个点路径的算法,同样在意数据的表达形式 。如果某个城市的地图像照片一样,一个像素接一个像素地被给出,那就很难找到想要的路径 。最好可以用综合的方法去描述,比如整合各个十字路口,通过连接街道,赋予每一段路一个长度 。这样一来,与其费力地从一个像素移动到另一个像素,不如从一个十字路口跳到另一个十字路口的算法来得轻巧 。
算法的方法已知的算法有很多,例如“分治法”“枚举测试法”“贪心算法”“随机算法”等 。
“分治法”是把一个复杂的问题拆分成两个较为简单的子问题,进而两个子问题又可以分别拆分成另外两个更简单的子问题,以此类推 。问题不断被层层拆解 。然后,子问题的解被逐层整合,构成了原问题的解 。高德纳曾用过一个邮局分发信件的例子对“分治法”进行了解释:信件根据不同城市区域被分进不同的袋子里;每个邮递员负责投递一个区域的信件,对应每栋楼,将自己负责的信件分装进更小的袋子;每个大楼管理员再将小袋子里的信件分发给对应的公寓 。
【未来世界,人类的生活不过是种种算法?】

未来世界,人类的生活不过是种种算法?

文章插图

最伟大的计算机程序员之一: 高德纳
高德纳(又译唐纳德?克努斯)生于1938 年,是著名的计算机科学家,也是现代算法的先驱之一 。他的系列巨著《计算机程序设计艺术》在计算机科学界享誉多年 。多年前,高德纳对现有的数学文本处理工具感到不满,于是创建了自己的工具 TeX 和 Metafont 。如今,这两个工具成为广泛应用的免费软件 。很多著名的算法都以他的姓氏命名,如克努斯- 莫里斯- 普拉特算法、罗宾逊- 申恩- 克努斯算法、克努斯-本迪克斯算法 。
“枚举测试法”列举出待解决问题的所有可能解,然后逐一进行检验,最后从中找出符合要求的解 。举个例子,一位旅行推销员必须依次访问几个不同城市拜访客户,他通常会寻找几个城市之间的最短回路,来安排自己的旅程 。寻找最短回路的算法旨在计算所有可能的回路 。例如有10 个客户,依次拜访10 个客户共有 10! = 3 628 800 种回路组合方式,分别计算每种组合方式的回路长度,然后选择最短的那条 。
当枚举测试法所需的计算量太大时,使用“贪心算法”能够找到一个合理的解决方案,使问题结果最优化 。比如,当旅行推销员有 20 位客户要访问时,用枚举测试法可能需要测试超过 2 兆条可能的路线 。与其这样一个个枚举,不如就地运行另一个算法:推销员每次都从当前所在城市选择去往距离自己最近的下一个城市,以此类推 。这个算法会选择当前最短距离作为计算的公里数,而且,永不退回到曾经选择过的路线上 。一般来说,贪心算法找到的解决方案可能不是最好的,但却是“合理的” 。
我们之前见过一个使用“随机算法”的例子:为了找到食物,侦察蚁从随机浏览蚁穴四周开始 。同样,许多其他算法也用到了随机源 。比如,“蒙特卡洛算法”能确定正方形内一个复杂图形的面积:在正方形中随机抽取一个点,就像扔飞镖一样,飞镖落在哪个点就取哪个点;大数定律告诉我们,这些点落入复杂图形内的频率接近于复杂图形面积和正方形面积之比 。

未来世界,人类的生活不过是种种算法?

文章插图

利用蒙特卡罗算法求 π 的近似值
机器学习我们要讨论到的最后一个方法是“学习程序” 。学习做面包、在字典中查找单词,人类对此习以为常 。但很多人可能想不到,算法也可以学习 。就像面包师每天能从自己的工作中学习、提高一样,算法也可以从重复相同的任务中学习、进步 。
音乐、视频、图书分享平台上使用的“推荐算法”就是一种会学习的算法 。系统程序会向用户推荐:“如果你喜欢《亚瑟王》,那你应当也喜欢《彼得?格里姆斯》 。”提出这样的推荐,系统并不是基于亨利?珀塞尔和本杰明?布里顿之间的联系① 。简单地说,系统的判断是基于对之前用户的听歌记录的分析:事实上,那些听过《亚瑟王》的用户之中,确实有很多人也听了《彼得?格里姆斯》;或者,算法尝试寻找一些我们可能并不认识,但品味却与我们接近的用户 。在这两种情况下,算法学习、发现、统计了歌曲之间或者用户之间的相似性 。从这样的学习程序出发,算法可以预测用户可能喜欢什么样的音乐,并因此会忍不住收听或者购买其他哪些作品 。