人和计算机对信息编码的差异
用一句话来讲计算机的功能,就是传输、存储和处理信息。要完成这样的任务,就要对信息本身进行编码,对信息要传送对目的地编码,对存储信息的物理单元编码。因此,有效的编码是计算机科学的基础。人们在对不同的对象进行编码时,主要考虑是否好记,而计算机则强调的是效率。
人类区别不同对象的思路和计算机完全不同,为了让计算机有效的工作,为它设计的编码有别于人们的思维习惯。因为,首先,暂时忘记人类的一些思维习惯,站到计算机的角度来设计其编码。在计算机行业里,从业者有无经验常常体现在动手开干之前,能否站在计算机的角度审视一遍自己的想法。其次,要善于建立起一座桥梁,实现那些计算机内部抽象编码和人能够理解的形象编码之间的一一对应关系。
逆向思考 —— 递归
人类其实生活在一个并不算大的空间中,因此对这个世界的认识是由近及远的,从小到多,一点点扩展开来,这就是人类的固有的认知和思维方式,这样的认知思维方式很容易理解具体的事物,但是限制了我们的想象力和大局观。计算机和人不同,计算机在一开始就被设计成用来处理规模大得多的问题,因此计算机有条件采用与常人完全不同的方式来解决问题。
用一个简单的数学题打开递归思想。数学公式中,2! = 2 ✖️ 1,3! = 3 X 2 X 1, ...... n! = n X (n - 1) X (n-2) X ...... X 3 X 2 X 1,这就是递推思想,举一反三,得到了 n!。如果反着看, n! = n X ( (n-1) X (n-2) X ...... X 2 X 1) 转换成公式 n! = n X (n-1)!,那我们只要解决了(n-1)!,就可以解决n!,递归迭代下去。
《抢 20》
Q:你和一位对手来做一个游戏,你们其中的一个人先从 1 和 2 中挑一个数字,另一个人则在对方的基础上选择加 1 或者加 2。然后又轮到先前的人,你或者他可以再次选择加 1 或者加 2。之后双方交替地选择加 1 或者 加 2,谁正好加到20,谁就赢来。你用什么策略保证一定能赢?
A:这个问题如果从小到大去考虑,多少有点难度。如果改成抢 5,或许会简单,再推论到抢 10。但是如果按照倒着的思路来想。要抢到 20 ,就必须要抢到 17,再以此类推,14、11、8、5、2,因此,只要你先说出了 2,你就赢定了。那无论抢50,100,都要看清楚无论对方是选择1还是2,你都可以控制每一轮两人喊出的数字个数总和为3,就可以牢牢的控制整个过程。
递归、遍历与嵌套
递归的特点其实是层层嵌套,这有点像俄罗斯套娃。其思维有两个明显的妙处,第一个妙处是只要解决当前一步的问题,就能解决全部的问题。比如阶乘只需要 n! = n X (n-1)!,只需要解决(n-1)!即可,那么可以复制一个过程便是它的第二个妙处。当然,有两个前提条件,首先,每一个问题在形式上都是相同的,否则无法通过同一个过程完成不同阶段的计算;其次,必须确定好结束条件,否则就会无限循环。
计算思维不同于人们通常的思维方式。概括来讲,人习惯于由小到大,由近及远,习惯于归纳总结经验;而计算思维则强调自顶向下,先全局、后局部,逐步分解,也就是递归的思想。递归的有点是以相同的方式去处理大问题和小问题,代码非常简单易懂。
延伸阅读:
递归:《上台阶问题 —— 斐波那契数列》、《汉诺塔和九连环》、《高斯的八皇后问题》
遍历:《前序遍历》、《中序遍历》、《后序遍历》、《广度优先遍历 - BFS》、《深度有点遍历 - DFS》
抽象与表示
用10个手指头,能表达多少个数字。
10个手指头,表达10个数字很简单想道。假如将左手作为十位,右手作个位,最多能表达100个数字。假如将10个手指头按照 0,1 表示,最多能表达 1024个数字。
分割黄金问题
用一根黄金分七天给予一个人,但黄金只能切两刀,保证每天正好能支付 1/7 的量。 7 = 1 + 2 + 4,按照计算机的表达方式,只需要在切两刀分割成, 1/7,2/7,4/7,就可以完成每天支付 1/7 的量。
在计算机表示信息,最关键的是把握二分原则,因为计算机是和二进制相连的,而二进制可以表示任何信息。其次,要想办法“挤掉”冗余的信息,最后,要想办法把最短的码字用在最常见的信息上,以提高信息存储和传输的平均时效。
总结
本文两章节的内容主要是讲述人与计算机思维方式的差异,通过差异总结计算机对信息处理差异方式不同,将处理信息的高度抽象在递归思想。理解递归思想与递推思想的不同,就很能体会到在处理大数据量方面,往前再去思考一步的嵌套结构,以整体到局部,局部到细节。
那既然各数据可以通过递归思想去访问计算,就必然需要高效的压缩信息资源,避免做大量无用功,以上一篇读书笔记,最好的路径还需要平衡各维度,才能达到以消耗最小的资源,同时完成多项任务。
下节预告 —— 分类与组合、图论及应用
https://yuque.antfin.com/docs/share/53ef7917-ca08-455d-89ee-6707b0cd9cfa?# 《《计算之魂读书笔记》》