从计算机算法到做事效率的提升

从上周开始,《吴军的谷歌方法论》中的文章,和计算机知识相关性更强了。在阅读老师精彩文章之余,也需多做一些自己的反思和总结,希望能跟上老师的脚步,对计算机思维有较多的认识,让自己更好地适应智能时代。

一、计算机算法的比较

对于计算机的算法,吴军老师是这样定义的:

科学家们在翻译现实世界的需求和计算机虚拟过程时,就提炼出一些高效的、不断被验证过的标准流程,这些流程就是我们所说的计算机算法。

计算机算法构成了计算机科学的基础。在算法上一个很小的差别,会导致计算机执行效率上千万倍的差距。受此启发,吴军老师常说,人和人水平的差别是数量级的。因为不同的做事方法,产生的效果之间会存在非常巨大的差异。

这里老师提出了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.和钱的距离不同

前者离钱较远,更多纯粹研究,后者离钱较近,更加务实。

通过分析两者的区别和联系,我认识到,纯粹的研究有助于技术产生量级上的提升,如果喜欢做研究,就不要羡慕做工程的人离钱更近,专心做出一些让世界有所不同的东西。如果喜欢做工程,首先要仔细查阅资料,找到现有研究成果中最先进的方法,在此基础上做微调

你可能感兴趣的:(从计算机算法到做事效率的提升)