公元2014年的冬天,一部讲述计算机科学之父艾伦·图灵传奇人生的传记电影在美国上映,这部影片就是《模仿游戏》。次年,该片荣获第87届奥斯卡金像奖最佳改编剧本奖,以及包括最佳影片、最佳导演、最佳男主角、最佳女配角在内的7项提名,一时风光无限。尽管现代计算机已经无处不在,但因图灵的时代离我们过于久远,现今人们对他的研究工作已经知之甚少。

要说起图灵的贡献,我们还得把时间再往前推。1900年,德国数学家大卫·希尔伯特在巴黎举行的国际数学家大会上作了题为《数学问题》的演讲,在这篇重要的演讲中,他提出了著名的希尔伯特之23个问题。尽管此后的数学发展远远超过了希尔伯特的预料,但他所提出的23个问题仍然对20世纪的数学发展起到了非常积极的推动作用。

希尔伯特的第10个问题是要设计一个算法来测试多项式是否有整数根。他没有使用算法这个术语,而是采用了下面这种表述:“通过有限多次运算就可以决定的过程”。有意思的是,从希尔伯特对这个问题的陈述中可以看出,他明确地要求设计一个算法。因此,他显然是假设这样的算法是存在的,人们所要做的只是找到它。现在我们知道,这个任务是无法完成的,即它是算法上不可解的。但对那个时期的数学家来说,以他们对算法的直观认识,得出这样的结论是不可能的。

非形式地说,算法是为实现某个任务而构造的简单指令集。以日常用语来说,算法又称为过程或者方法。算法在数学中也起着非常重要的作用。古代数学文献中就包含有执行各种各样计算任务的算法描述。例如,我国古代数学经典《九章算术》中就记述了包括求最大公约数、最小公倍数、开平方根、开立方根等在内的诸多算法。现代计算机科学中更是充满了各种各样的算法。例如,求解最短路径的狄克斯特拉算法,进行字符串匹配的KMP算法等等。

虽然算法在数学中已有很长的历史,但在20世纪之前,算法概念本身一直没有精确的定义。数学家们面对希尔伯特的第10个问题,显得束手无策。由于缺乏对于算法本身的精确定义,所以要证明某个特定任务不存在算法就完全不可能了。要想破解希尔伯特的第10个问题,人们不得不等待算法之精确定义的出现。

直到1936年,曙光似乎出现了。图灵向伦敦的权威数学杂志递交了一篇题为《论数字计算在决断难题中之应用》的论文。该文最终于1937年正式发表,并立即引起了广泛的注意。在论文中,图灵描述了一种可以辅助数学研究的机器,也就是后来被称为“图灵机”的抽象系统。与此同时,另外一位数学家阿隆佐·丘奇也独立地提出了另外一套系统,即所谓的Lambda演算。图灵采用他的图灵机来定义算法,而丘奇则采用Lambda演算来定义算法,后来图灵证明这两个定义是等价的。由此,人们在算法的非形式概念和精确定义之间建立了联系,即算法的直觉概念等价于图灵机算法,这就是所谓的丘奇-图灵论题。

丘奇-图灵论题提出的算法定义是解决希尔伯特第10问题所必需的。而第10问题的真正解决则要等到1970年,借助于丘奇与图灵的杰出贡献,马提亚塞维齐(Yuri Matiyasevich)在戴维斯(Martin Davis)*、普特纳姆(Hilary Putnam)和罗宾逊(Julia Robinson)等人工作的基础上,最终证明检查多项式是否有整数根的算法是不存在的。上述四人的名字也紧紧地同希尔伯特的第十个问题联系在了一起。破解希尔伯特之第十个问题的历史更像一场声势浩大又旷日持久的国际协作和学术接力。每个人的工作都必不可少,而且大家都感觉已经相当接近问题的最终答案了。后来的历史鉴证了马提亚塞维齐敏锐地接过最后一棒并完成终点冲刺的伟大一幕。更有意思的是,彼时正值美苏冷战最为紧张的时期,两个超级大国之间的正常学术交流几乎完全中断。但这或许就是科学无国界的一个重要体现,尽管国家层面上双方剑拔弩张,而科学们在私下仍然以一种惺惺相惜的默契方式彼此神交。特别是在得知苏联数学完成了最终的证明时,美国同行们都表示相当的振奋和由衷的喜悦,这不得不说是学术界的一段佳话。

              

Yuri Matiyasevich(1947—)         Hilary Putnam(1926 – 2016)

俄罗斯数学家和计算机科学家         美国数学家和计算机科学家

   

Martin Davis(1928—)                 Julia Robinson(1919 – 1985)

美国数学家                                       美国数学家

回顾建立算法形式化定义和破解希尔伯特之第十个问题的那段风起云涌的历史,更多地是想说明算法之于我们的世界是多么的重要。而谈到算法的重要性就不得不提及计算机科学家安德鲁·艾派尔在1985年所开展的一项研究工作,这也是程序性能优化领域的经典案例。彼时,艾派尔编写了一个用于计算重力场中天体间相互作用之问题的程序。给定场中物体质量、初始位置和速度等条件,该程序即可对10000个天体相互作用时其中两个天体的运行状态进行模拟和仿真。由于计算量太大,最初的程序要完成该项计算大约需要耗时一年。在一系列的改进之后,艾派尔最终将程序耗时有效地缩短到了一天!而在这个改进过程中,算法和数据结构的调优占了主要比重。

无论你是信息技术的从业人员,还是计算机专业的在校学生,再或者是从事相关专业的研究人员,熟练掌握一门计算机语言都重要性都不言而喻。但是不是掌握了这其中的语法规则就能写出漂亮的程序了呢?答案当然是否定的。因为你还需要另外一样至少同等重要的工具——算法。算法和语言的关系,其实很像是“道”和“术”的关系。掌握一门语言,就如同习得一门技艺,可以成为一名工匠。但要想从工匠一跃成为大师,单单停留在“术”的层面显然不够,更重要的是悟“道”。而算法无疑就是计算机程序设计中的“道”。事实上,从图灵开始,算法已然同计算机科学之间产生了密不可分的联系。在与信息技术相关的工程应用领域,我们同样需要各种各样的算法。在计算机及其相关领域,算法无疑就是阿里巴巴打开惊人宝藏的通关密语,只有掌握它的人,才能获得披荆斩棘、扬帆远航的符咒,才能见识到更加广阔的风景。

---------------------------------------------

* 戴维斯在得到相关成果时应用了中国剩余定理。

【本文完】

隐匿在数据结构背后的原理相关推荐

  1. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  2. MySQL索引背后的数据结构及算法原理--转

    MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 原文地址:http://blog.codinglabs.org/articles/t ...

  3. MySQL 索引背后的数据结构及算法原理

    本文转载自http://blog.jobbole.com/24006/ 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储 ...

  4. epoll背后的原理

    1 简介 Epoll 是个很老的知识点,是后端工程师的经典必修课.这种知识具备的特点就是研究的人多,所以研究的趋势就会越来越深.当然分享的人也多,由于分享者水平参差不齐,也产生的大量错误理解. 今天我 ...

  5. 文件名为空linux,文件系统:隐匿在Linux背后的机制

    原标题:文件系统:隐匿在Linux背后的机制 在 Linux 中,最直观.最可见的部分就是 文件系统(file system) .下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及 ...

  6. 从XML文件乱码问题,探寻其背后的原理

    由于网友反应本文图片不能显示,由于时间关系未能及时修正.请访问原文地址: 本文出自http://blog.csdn.net/dinglang_2009/article/details/6895355, ...

  7. 【转】前端精选文摘:BFC 神奇背后的原理

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  8. 优化安卓应用内存的神奇方法以及背后的原理,一般人我不告诉他

    安卓应用一般都害怕自己被杀.内存占用高是被杀的重要原因之中的一个.所以大家都想尽各种招数应对,但效果都一般. 但有一招: WindowManagerGlobal.getInstance().start ...

  9. 搜索引擎背后的原理和中文日志检索

    摘要: 日志服务支持的两种搜索方式 通过设置分词字符(通常是标点符号),把一段文本划分成不同的单词.分词字符只能是单字节ascii字符这种方式适合于切分英文单词.这种方式对于中文日志,必须要搜索中文语 ...

  10. 对接kafka_Kafka系列9:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(上)...

    ​前言 在本文开始之前,作者一直有个疑惑,就是面试题是只写写问题和答案就草草了事,还是应该深入分析一下其背后发生的一些原理.和朋友探讨以后作者还是决定采用后者的方式,因为我认为不仅要做到知其一,更要知 ...

最新文章

  1. 文件数据云计算学习笔记---Hadoop HDFS和MapReduce 架构浅析
  2. oracle定时器每天下午6点_周五下午6点到8点 万盛经开区党工委书记、管委会主任袁光灿直播带货...
  3. mfc 饼图绘画_每周推荐|江南百景图放置类佛系游戏,慢慢玩才是乐趣
  4. [Android学习系列14]聊天通信的实现
  5. 3类代码安全风险如何避免?
  6. MAT分析android内存泄漏
  7. python调用网络摄像机
  8. 乐谱五线谱排版软件种类与介绍
  9. inode客户端连接成功上不了网_Inode客户端上网常见问题及解决办法
  10. html页面乱码解决
  11. 计算机now函数,玩转NOW函数 日期时间随心变
  12. 芯片工程师成长之路_从入门到精通,电子硬件工程师的成长之路
  13. mac下配置subl启动sublime text 编辑器
  14. (三十六):How Will Your Tweet Be Received? Predicting the Sentiment Polarity of Tweet Replies
  15. itext html 转换pdf后 字体加粗,java - 如何使用ITEXTRenderer将HTML转换为PDF时设置新的不同字体 - 堆栈内存溢出...
  16. 拆分list的通用方法
  17. springboot启动突然报错Could not resolve placeholder 'spring.datasource.driver-class-name'
  18. Vibration API
  19. 【图像叠加】将一个图片放到另一个图片上
  20. creo分割实体_Proe/Creo曲面分割·这个新功能你会用了吗?

热门文章

  1. 5G NR 随机接入过程(2)
  2. java调色板代码_调色板的代码
  3. KRC跨境商城系 拍卖系统 竞拍系统 商城系统 虚拟支付源码
  4. 最新鲸发卡企业发卡网系统源码+免授权
  5. 希捷硬盘查询保修期限的网址
  6. 【BZOJ1492】【NOI2007】货币兑换 Cash(CDQ分治,斜率优化)
  7. manjaro设置字体_Manjaro 20.03字体美化的2.5个级别
  8. java醉汉_醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)
  9. php查找sql,sql如何去重查询
  10. 自学编程/如何自学编程//自学C语言/如何自学C语言//自学java/如何自学java?