算法的力量(李开复)

算法的力量
算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为 学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机 算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库 原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没 有功力,是不可能成为高手的。
算法与我
当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没 有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。” 其实,这点他们彻底弄 错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和 手段的最佳演绎就是“算法”。
记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发 现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数 函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速 度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景 的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊 讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当 然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!
网络时代的算法
有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力 每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等 等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步, 数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法 来解决。
再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?
最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。
这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法呢?
首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。
问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出 几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底 层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。
上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去 一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范 围,一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。
通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小问题,然后再选用合适的算法和数据结构。
并行算法:Google的核心优势
上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱, Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实。
在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访问Google的网站,使用Google的服务,也 产生很多很多的日志(Log)。因为Log每分每秒都在飞速增加,我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对log进行一些分析处理 的问题,有很多面试者的回答虽然在逻辑上正确,但在实际应用中是几乎不可行的。按照他们的算法,即便用上几万台机器,我们的处理速度都跟不上数据产生的速 度。
那么Google是如何解决这些问题的呢?
首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的是超大的并行计算机。但传统的并行算法运行 时,效率会在增加机器数量后迅速降低,也就是说,十台机器如果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可 以负担得起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。
那么Google是如何开发出既有效率又能容错的并行计算的呢?
Google最资深的计算机科学家Jeff Dean认识到, Google 所需的绝大部分数据处理都可以归结为一个简单的并行算法: Map and Reduce(http://labs.google.com/papers/mapreduce.html)。 这个算法能够在很多种 计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。Map and Reduce 的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个server farm里面的机 器down掉一半,整个farm依然能够运行。正是因为这个天才的认识,才有了Map and Reduce算法。借助该算法,Google几乎能无限地 增加计算量,与日新月异的互联网应用一同成长。
算法并不局限于计算机和网络
举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处 理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基 因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气象方面,算法可以更好地预测未来天灾的发生, 以拯救生命。
所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益减小,而是在日益加强。
给程序员的七个建议
(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结 构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够 解决其中的大部分题目,就说明你在算法方面有一定的功力了。
(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编 译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四 年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。
(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很 肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中 是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没 有详细提到,只有通过踏实的实干才能真正掌握。
(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来 的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。
(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。
(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业 都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。
(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使 用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境, 一个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。
希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来!

转载于:https://www.cnblogs.com/flying_bat/archive/2009/03/17/1414657.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冒名者还是重名?疑惑中!

虽然已经算是离开存储行业了,但是还是偶尔去存储行业的专业中文网站瞄上几眼,还是很关注存储行业的发展。今天早上无意中打开Dostor([url]http://www.dostor.com[/url]),看到前段时间讨论的关于IBM存储价值的问题又重新归来,如下所…

Oracle CRS stack is already configured and will be running under init(1M)

REDHAT 4 重装ORACLE 10G RAC 安装完CRS后跑root.sh脚本一闪而过,提示CRS stack is already configured该问题可以通过root用户在每个节点上删除/etc/oracle/scls_scr/rac1/oracle/cssfatal 文件即可转载于:https://blog.51cto.com/803517/1372474

过了双十一之后的你。。| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源 阿粪青,侵权删)

Asp.Net Core 中如何设置 IP 白名单

咨询区 MartinM&#xff1a;我想在一个web站点中实现ip白名单功能&#xff0c;在 MVC 时代我只需要在 web.config 中添加如下配置即可。<security><ipSecurity allowUnlisted"false" denyAction"NotFound"><add allowed"true" ip…

计算机专业考研末流211和双非,211大学考985研究生难吗,如何看待本科985学生读研去211学校?...

今天小编先给大家讲一下关于考研的一些事情&#xff0c;我发现很多同学对于考研还是云里雾里的&#xff0c;连考研有哪些科目都不清楚。211大学考985研究生难吗对于考研&#xff0c;小编认为选择比努力重要&#xff0c;动力很大程度决定了你的结果&#xff0c;希望通过211大学研…

失业、创业。。。

在这个经济危机的时候&#xff0c;突然遭遇失业。呵呵&#xff0c;&#xff0c;暂且不说失业的原因了。当然这样的事情可能每天多发生。在一个企业里面待的时间长了对自己的发展未必是好事。在目标我待了两年&#xff0c;突然出来以后发现自己多难以适应这外面的世界。就像井底…

Exchange server 2007 出现“0x8004010F”错误的解决办法

环境&#xff1a; 服务器&#xff1a;Exchange server 2007 客户端&#xff1a;outlook2003或outlook2007 在outlook中通过MAPI方式访问Exchange server&#xff0c;在点击"发送接收"后出现0x8004010F的错误。 -------------------------------------------------- 1…

Hello Blazor:(7)WebAssembly、Server模式你选哪种?小孩子才做选择!我用混合模式...

在上次的文章中&#xff0c;我们介绍了“Blazor WebAssembly和Blazor Server的区别”。它们各有优缺点。Blazor WebAssembly的优势在于运行期间可以和服务器无交互&#xff0c;但是需要长时间下载资源&#xff0c;而Blazor Server则首次加载速度非常快&#xff0c;但是必须和服…

一生只有43年,喜欢泡妹打架,却凭借一篇文章震惊世界,跻身一流数学家

全世界只有3.14 %的人关注了青少年数学之旅不会做就别乱套我洛必达的公式!——节选自《数学之旅 闪耀人类的54个数学家》众所周知&#xff0c;求极限是高等数学中最重要的内容之一&#xff0c;而洛必达法则将对原式的求导转化成了导函数形式的问题&#xff0c;这就大大简化了一…

ORACLE 常用函数

好像ORACLE的资料比较少,把ORACLE的常用函数写下,以备一时忘记查看用...1.INITCAP 返回字符串并将字符串的第一个字母变为大写; SQL>selectinitcap(smith) upp fromdual;-----Smith2.CONCAT 连接两个字符串; SQL>selectconcat(010-,88888888)||转23高乾竞电话 fromdual;-…

计算机三级网络技术分值占比,大一能考计算机三级吗?计算机三级考试题型分析...

原标题&#xff1a;大一能考计算机三级吗&#xff1f;计算机三级考试题型分析计算机等级考试&#xff0c;很多学生在刚刚进入大学时&#xff0c;就想把计算机三级证书拿到手。那么&#xff0c;大一能考计算机三级吗&#xff1f;计算机三级考试题型有哪些&#xff1f;下面&#…

asp.net网页上嵌入Flash显示

网页上显示Flash&#xff0c;功能实现&#xff1a; 文件格式&#xff1a;.wmv;大小&#xff1a;19,530KB;长度&#xff1a;00:27:39&#xff1b;还包含JavaScript与用户控件等文件。 下载地址&#xff1a;http://download.cnblogs.com/insus/ASPDOTNET/Flash.zip转载于:https:/…

DTO 和 POCO(或 POJO)有什么区别

DTO 和 POCO&#xff08;或 POJO&#xff09;有什么区别原文链接&#xff1a;https://ardalis.com/dto-or-poco/作者&#xff1a;Ardalis Steve在讨论 .NET 和 C# 中的软件开发时经常出现的两个术语是 DTO 和 POCO。一些开发人员交替使用这些术语。那么&#xff0c;DTO 和 POCO…

Nginx server之Nginx作为反向代理服务器

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;Nginx介绍 1.Nginx简介&#xff1a;nginx [engine x]是一个俄罗斯人编写的HTTP和反向代理服务器&#xff0c;另外它也可以作为邮件代理服务器。 它已经在众多流量很大的俄罗斯网站上使用了很长时间&#x…

增加FiroFox3对迅雷的支持

当然&#xff0c;这对于Firefox来说是最好的了&#xff0c;以前的Thunder 扩展”Thunder Extension1.1“在firefox 2.0.0.4之后就不能用了&#xff0c;现在该扩展用的用的版本是”Thunder Extension3.5“。不用大家满世界找了&#xff0c;迅雷已经内置了。 注意&#xff1a;鉴于…

***一般如何***服务器

***方式&#xff0c;前期准备工作&#xff0c;漏洞收集&#xff0c;扫描&#xff0c;路由及网关分析&#xff0c;然后有网络编程以达到***的作用以至被***的机器瘫换.这种是具备专业知识的.一般的就是用工具了***.比如用工具发大量数据包,造成拒绝服务器***,SYN同步***.总的来说…

为什么现在老师这么难,值得大家深思

致各位老师不知不觉&#xff0c;顶级教师圈已经陪伴大家走过3个月的时光。我们每天为教师们推送教育资讯&#xff0c;得到了许多关心和支持。为了感谢各位教师们的支持和鼓励&#xff0c;顶级教师圈今日特举办限时资源福利活动。我们精心整理了100G海量教学资源&#xff0c;包含…

学计算机要买什么样的电脑,大学开学要买电脑吗?又要买什么样的电脑?看准这些再买也不迟!...

电脑是我们生活中重要的通讯工具&#xff0c;方便了我们学习办公、工作设计、娱乐游戏&#xff0c;我们也越来越依赖电脑处理不同的事情&#xff0c;尤其是现在的开学季&#xff0c;很多准大学生都准备给自己购置一台电脑&#xff0c;但是由于自己不懂&#xff0c;买了怕被坑&a…

C#中的解构

解构是将一个对象分割成若干部分并将其存储到新的变量中。在 C# 中&#xff0c;解构可以方便地一次性将一个对象的多个成员的值存储到多个变量中。1解构元组元组为方法返回多个值提供了便捷&#xff0c;无需创建额外的类型来承载返回的值。例如&#xff0c;下面这个方法使用元组…

javascript一些常用的代码

1&#xff1a;Response.Write("<script>alert(登录名和密码不能为空&#xff01;);locationjavascript:history.go(-1);</script>");返回上一页&#xff1b; 2&#xff1a;增加到收藏夹&#xff1a;javascript:window.external.addfavorite&#xff08;“…