从上周开始,《吴军的谷歌方法论》中的文章,和计算机知识相关性更强了。在阅读老师精彩文章之余,也需多做一些自己的反思和总结,希望能跟上老师的脚步,对计算机思维有较多的认识,让自己更好地适应智能时代。
一、计算机算法的比较
对于计算机的算法,吴军老师是这样定义的:
科学家们在翻译现实世界的需求和计算机虚拟过程时,就提炼出一些高效的、不断被验证过的标准流程,这些流程就是我们所说的计算机算法。
计算机算法构成了计算机科学的基础。在算法上一个很小的差别,会导致计算机执行效率上千万倍的差距。受此启发,吴军老师常说,人和人水平的差别是数量级的。因为不同的做事方法,产生的效果之间会存在非常巨大的差异。
这里老师提出了A、B两种算法的比较:
场景一:使用1万个数据进行测试,算法A的运行时间是1毫秒,算法B的运行时间是10毫秒。
场景二:使用100万个数据测试,算法A运行10000毫秒,算法B运行6000毫秒。
看似A在数据少时有优势,B在数据大时有优势,无法比较,但算法分析之父高德纳确定了算法比较的标准。
在比较算法快慢时,需要假定数据量会达到近乎无穷大。然后,将影响算法快慢的因素分为两类:一类不随数据变化,另一类是随着数据变化的。
在比较两种算法的时候,只关注第二类影响因素,也就是随着数据变化的影响因素。如果两种算法在量级上是相当,那么就认为两种算法是一样好的,不必计较三五倍的差别。
高德纳之所以能提出这样的理论,在于他能将问题理想化,提出次要因素,考虑最重要的因素。这样的思想对于我们很有启发意义。
记得在物理化学中,科学家为了简化问题,会将实际气体简化为理想气体。就是假定气体分子本身的体积,气体分子之间的受力和气体分子碰撞的能量损失,都可以忽略不计。基于理想气体的模型来研究问题,可以极大地简化计算,只考虑压强和温度对于空气系统的影响。这样简化的过程,是一个忽略次要因素,侧重研究重要因素的过程。当然,在一些特定的空气系统中,科学家会对理想气体方程进行修正,以便更好地模拟实际气体,以便降低误差,得到更准确的结果。
这样的思维对于我的启发是,面对生活中的问题,可以抽象出影响的因素,找到最主要的矛盾,用最主要的精力把主要矛盾解决了,再去逐个解决次要的矛盾。
二、从排序算法到提高效率的本质
在生活中,我们会面对很多具体的排序问题,比如一个年级的学生按照成绩排序,电商按照商品的交易量排序等。将这些现实世界的问题,变成计算机可运行的程序,中间的桥梁就是排序算法。
文中老师介绍了最基本的插入法和冒泡法,两种算法出于同一个量级,是一样好的。那么更好的算法是怎样的呢?
这就要提高计算机的效率,而提高计算机效率的方法,就是让计算机少做事情。这里老师介绍了一种叫作归并排序的方法。当处理的数据为1万时,冒泡法和插入法的复杂度是1亿,而归并算法的复杂度是13万,可见归并算法比前两者要好处很多。这也就是为什么,水平较差的程序员会无端浪费成千上万倍的计算资源了。
归并算法的效率之所以这么高,是因为它减去了很多不必要的比较。这里老师也再次说明了自己的做事方法,就是少做事情,把每一件经手的事情都做到很好。
效率=产出/所做的事情。人的产出是很难提高的,但是所做的事情是可以减少的。
三、快速排序:要想提高效率就要少做事情
在这里老师介绍了目前最好的排序算法:快速排序法。该方法的基本思路如下:
首先,对于一大堆无序的数字,从中随机挑选一个,比如是53,这个被随机选上的数字被称为枢值。这个枢值可以将所有数值分为两组,一组大于53,一组小于53。
然后,从上面得到的两堆数字,分别采用第一步的方法各自再找一个枢值。这样一层层找下去,很快就把所有的数字排好了。
快速排序在归并排序的基础上,进一步少做了事情。
那么是否有比快速排序更优的排序方法呢?答案是否定的,关于这一点已经在数学上证明过了。这就是我们做事情的边界。如果一个人不去认证读数学证明,而是一心要去研究更好的排序算法,就是浪费自己的时间。我们一定要在边界内做事。
关于快速排序,古小千同学的留言非常精彩。我们经常在做计划排优先顺序上花了大量的时间,小千同学给出了一个不错的方法:
首先找到一个显而易见的待办事项(枢值),接着综合考虑急迫性和重要性,分成两拨;再将两拨事情找到枢纽,就把所有的工作,依照平分分成四份了。
再接下来,我会快速检查后两部分的事情,将不必要的事情减法删除、将重要但不急迫的事先预定计划。然后专注完成前两部分的事,透过排序和减法,一天要完成的事就只剩约一半。枢纽这个节点,帮我们梳理参考点,而事情一件件单看,很难取舍;但有了参考,一比较就能掂量差别,勇敢做减法了!
对于快速排序的实际应用,我是这样理解的。我们要做的事情大体可以分为工作方面和生活方面。由于我们一段时间只能做一件事情,那就要从工作中找到最重要的事情,生活中找到最重要的事情,比较两件事情的优先级。
就工作方面而言,我们又有很多不同的选项,可以深入当前的工作,可以准备换工作,也可以思考创业。因为我现在的公司就是老师说的底层员工和总经理差不多的单位,所以最近在考虑换工作(其实考虑很久了…)。过年时候有朋友联系我,希望我和他一起做B2B平台方面的创业项目。如果平台发展顺利,那么后期的回报是非常大的。但我综合考虑了一下,目前自己的能力还不足以胜任。自己本身的基线还不够把这件事情做好。那么我现在的优先顺序就是:换工作>本职工作>创业。
然后在每个小的方面,再进行排序,优选出最重要的事情。老师说想要提高效率就要少做事,对于最终要选择哪些事情来做,快速排序法是一个不错的方法,帮助我们确定优先顺序。
四、计算机科学和计算机工程的差别
这里老师分析了计算机科学和计算机工程的三个差别:
1.方向和道路之分别
前者指明方向,后者铺就道路。
2.关注的事情不同
前者关注的是算法在量级上跨越式的提升,不会过分考虑处理器时间、计算机内存等限制;而后者则要考虑很多具体的问题,即便能节省20%的时间也是有意义的。
3.和钱的距离不同
前者离钱较远,更多纯粹研究,后者离钱较近,更加务实。
通过分析两者的区别和联系,我认识到,纯粹的研究有助于技术产生量级上的提升,如果喜欢做研究,就不要羡慕做工程的人离钱更近,专心做出一些让世界有所不同的东西。如果喜欢做工程,首先要仔细查阅资料,找到现有研究成果中最先进的方法,在此基础上做微调。