从算法思维向计算思维趋近

2022-03-18 22:39陈凯
中国信息技术教育 2022年5期
关键词:二进制排序头脑

陈凯

计算思维和算法思维,这是两个不同且又有关系的概念,从已有文献资料看,对两者概念的辨析并不多见。有教师认为,算法思维是计算思维的一个方面,算法思维的培养是计算思维发展的重要路径[1];也有教师认为,算法本身就蕴含计算思维的思想和方法[2];甚至有教师断言,在算法思维的培养中,其实已经培养了大部分的计算思维。[3]让笔者感兴趣的问题是,如何将算法思维和计算思维两者区别开来?或者换成更通俗的问法,如何说服他人,某一部分的教学内容意在培养计算思维,其中可能也同时包括了算法思维的培养,但又不仅仅是算法思维的培养?

算法一般指求解某一问题所能描述的有限的步骤,从计算机科学的角度看,算法这个概念通过图灵机的行为和能力得到了精确的定义。但若问算法思维是什么,却不能简单地将其等同于设计规则使图灵机解决某问题的思维,这是因为虽然算法可运行于图灵机这种计算模型上,但实际问题的解决步骤却往往借助图灵等价的计算模型(最常用的是各种高级程序语言)来实现,并不会特意去关注图灵机规则设定中必然涉及的读写头转移和数据存储的方式。也就是说,在实际用算法解决问题的过程中,图灵机底层的行为往往被封装起来了。虽然对算法思维进行定义相当困难,但能得到共识的是,算法思维具有以机械化方式进行计算的特征。本文试图通过几项教学活动,对计算行为中的思维过程本身进行分析,来说明算法思维是如何在解决问题的过程中发挥作用的,算法思维又是在什么时候趋近计算思维的。

● 十进制和二进制转换中算法思维向计算思维的趋近

常用的将十进制数转为二进制数的方法称为除二取余法(所谓除二其实是用二来除),如图1所示就是对十进制数35按除二取余法计算出二进制编码。计算过程的实施者并不需要知道何以如此计算,他只要严格遵照预先设定的规则进行除二取余的工作,并记得从下至上倒序读数,就能得出正确的结果。此过程具有十分显明的机械化的特征。

请考虑以下与除二取余法略不同的将十进制数转换为二进制数的方法:首先,在纸张左侧写下某十进制数字,如35,判断其奇偶,如果是奇数,在其右侧写1,否则写0。其次,将35整除以2,得到结果置放在下一行,并重复先前动作(如图2)。由于0整除0总是为0,所以对人来说,自然而然就可以获知重复动作终止的时刻。

实验表明,在两种方法都花费大致同样时间讲授的情况下,在允许学生自由选择十进制数转换为二进制编码的方法时,大部分学生都选择了第二种方法,选用第一种方法的学生数量仅仅约为总数的三分之一。这是为什么呢?笔者认为,第二种方法将除以2的动作在计算步骤中抽离了出来,完全交由头脑来处理,将数据的变化通过更简单的空间上的转移存储在纸张上。图3显示了两种计算方法在存储变化了的数据时,纸张上记录空间发生变化的状况。可以看出,在新的方法中,数字的变化情况能够更简洁而整齐地记录在二维的纸张平面上。

考虑一下,假如不用纸笔,完全在头脑中实现十进制数的二进制编码转换,可以进一步将二维空间上的数据记录方式转变为一维空间上的数据记录方式。其过程按时间序列可以简单记录为如图4所示的样子。

按这样的方法,可以将数据的变化情况在一维的空间中进行记录,这使得人能够更容易通过心算将十进制数转换为二进制编码。

类似地,也可以将二进制数转换为十进制数的数据变化情况,都存储在一维的空间中,方法是从数码最左侧开始,将每个数码乘以2后右移一个数位并与该数位上的数字叠加,反复此操作。以二进制数100011举例演示如图5所示,空出的位用下画线表示。

以上事例说明,同样具有机械性特征的算法,用纸笔计算,与用心脑计算相比,其行为特征是不同的。从这个结论可以得到一个新的研究点的提示,用机械来实施具有机械性特征的算法,与用纸笔、用心脑来实施具有机械性特征的算法,一定是有不同之处的。

傅海伦指出,中国古代数学的算法机械化是与筹算体系下的位置思维协调一致的[4],此文给予笔者很大的启发是,计算过程中固定的数据存储位置强化了数学算法中的“机械性”,使得人工实现的重复运作更便于计算机的实现。如果说十进制数转二进制编码的除二取余法体现了算法思维的运用,那么本文给出的简化方法以及心算方法,则有着向计算思维趋近的特征,之所以说“趋近”而不说“体现”,是因为还缺乏一种构造性的方案,让整个运算过程真正自动化地运行起来。

● 循环结构实现累加中算法思维向计算思维的趋近

在人的头脑中计算自然数的累加,似乎是件容易的事情,但为什么用循环结构实现自然数累加的程序代码会让许多初学者感觉疑惑呢?笔者首先考察的是自己头脑中的累加过程:首先,有一横列的自然数1、2、3、4……,然后取出1和2相加得3,头脑中的景象变为3、3、4、5……,然后取出3和3相加得6,头脑中的景象变为6、4、5、6……。在整个过程中,加法的结果和数列都在某个一维的数据空间中,而随着加法的继续,数列会在尾部自动增长。然而这样的思维,是很难和循环结构的累加程序代码相契合的,在对学生的调查中发现,有相当多的学生,在实施自然数累加的过程中的思维模式是和以上方法类似的(这里不考虑使用数列求和公式的方法)。

有兴趣的教师也可以自己开展相关调查,调查的一个诀窍是,当学生说用1加上2得3,用3加上3得6,用6加上4得10的時候,重点询问那个“4”是从何而来的。例如,他可能回答,这个“4”一直在某个列表中,既然“3”已经被使用了,接下来自然是要加上“4”;或者他也可能回答,这个“4”是由原来的自然数“3”加上1得到的……调查的另一个注意事项是,被调查学生不能是已学习过用循环结构语句实现自然数累加的方法的。笔者调查发现,采用前者方法的学生人数要多于后者。

有少数学生给出的思维方法是这样的,在头脑中有两个位置存放数字,分别是累加的数和自然数,初始时是“0,1”,意味着累加值为0,自然数为1。其后进入到将两个数字的相加并存入左侧位置,而右侧位置的数字自增1的重复模式,存储空间变化模式如图6所示。

在头脑的整个想象过程中,有如动画般的变换效果会使得问题更容易理解,如右侧位的“1”发生了分解,变换出新的“1”,与左侧空间的“0”相加得到“1”,然后右侧位的“1”自增变成“2”,然后就是重复以上过程。

以上实验可以说明,即便是在人的头脑中进行计算,也往往需要借助固定的数据存储位置,来实现计算过程的机械化。但数据存储和调用的具体方式,不总是和计算机处理数据的方式相类似。

● 排序算法中算法思维向计算思维的趋近

将头脑的排序方法和计算机算法的排序方法进行比较,也可以通过“位置”使用方式看出算法思维与计算思维的不同。

假设一列数据存放在某个一维的空间中,空间最前面和末尾可以任意添加新的空间,这些数据是乱序的,现在要对它们从小到大进行排序,存在两种情况:①数据量超出了头脑能同时把握的程度;

②允许随意阅览这些数据中相邻的部分数据。那么,应该如何对数据进行排序呢?大部分人使用的方法是,通过分段阅览找到其中最小的数字,将这个数字移到这列数据最前面,然后对剩余的数据做同样的操作。这个方法体现了具有机械化特征的算法思维的运用,但却较难交由一个真正的机械来实现。对于一个机械来说,每个数据在某一时刻都必须停留在某个位置上,这与人的头脑处理数据的方式有明显的不同。为了能让机械处理数据成为可能,在应用以上排序方法时,就需要在整个数据列的最前面,新开辟出一个存储数据的位置,然后寻找得到最小的数字,将这个数字移动到这个新开辟的位置,接着还要为后续重复操作做好准备。例如,一个容易想到但效率比较低的方案:将移走数字后留出的空档,用后续数字逐个移过来填满(每次移动都会出现新的空档,然后再用更后的数字填满),接下来,是要在处于数据列首位的最小数的后面,插入一个新的空档,以存放第二小的数字,但为了做到这一点,就需要首先在处于首位的最小数字前开辟一个新空间,然后将最小数移动到新的位置,腾出第二个位置。当然,为了使以上操作能够顺利实施,还需要记录已经移动了几个数字过来,这样才能确定将新找到的数字填充到哪里,这个记录可以存放到空间末尾某个地方,不过这就产生了一个新的麻烦,怎样避免这个记录本身不被当成要排序的数据……可以看出,头脑容易解决的问题,换做用固定位置转移和填充的机械方法来实现,就相当烦琐。那么,为了简化以上烦琐过程,就需要从算法思维向计算思维趋近。

对比以上烦琐的机械化的排序过程,才能更好地体现出一些经典排序算法的精妙,以冒泡排序算法为例,可以在数据空间末尾添加四个新的空间,一个用来充当交换数据的临时变量,一个用来记录需要排序数据的数量,另外两个用来记录冒泡的轮次和比较的位置,程序代码中除了数据空间自身以外,并没有其他变量,这样就在一个固定位置的数据空间中实现了排序,如图7所示。

对比传统的冒泡排序算法的程序实现,将程序代码中所有的变量操作都以列表或数组中数据的变化来加以替代,就使得整个算法更具有机械自动化的直观性。这就实现了从算法本身的学习向算法之所以能使机械自动化工作有效的探索过程的还原,从而领悟到机械自动化直观和人类头脑中所想象和容易理解的自动化两者间的差别,以及在思考如何在两者间建立转换关系的时候,其所需要的思维方式就不能仅用算法思维来涵盖了。

通过本文的例子回顾“算法本身就蕴含计算思维的思想和方法”这句话,也许能有更深的理解,那就是,可以将计算机的算法看成是算法思维和计算思维的共同成果。在教学中,计算机算法不是现成的等待了解的某物,而是从机械性的思维方法出发,经由研究分析如何让机械可以真正且有效运作此算法过程而得到的成果,而这种研究分析和实现的路径,则体现了计算思维的应用。

参考文献:

[1]周世杰.從计算思维的视角辨析算法中的递归与迭代[J].中国信息技术教育,2020(09):53-55.

[2]刘梅彦,徐英慧.大学计算机基础教学中算法思维的培养[J].软件导刊,2016(04):199-201.

[3]马波.从算法思维到计算思维[J].软件导刊·教育技术,2019(05):71-73.

[4]傅海伦.位置思维方式与数学机械化[J].科学技术与辩证法,2000(01):36.

3808500589294

猜你喜欢
二进制排序头脑
头脑对对碰
有用的二进制
用Scratch把十进制转为二进制
恐怖排序
有趣的进度
节日排序
超级头脑训练营
头脑奥林匹克
头脑奥林匹克