从计算机中的概念和机制看如何对问题产生思考

从计算机中的概念和机制看如何对问题产生思考

无论我们是否还是学生,面对问题并尝试解决都是我们生活中非常重要的一部分。简单的问题大多数人都能解决,可难题则只有少部分优秀的人可以攻破。当这些优胜者把他们的方案公布时,我们会恍然大悟,变得也能够解决这个问题了,觉得它好像也没那么困难。可是当新的问题(甚至只是把原有的问题稍加改动)出现时,情况又回到原来的状态了。
那么,到底为什么他们能解决的问题,我们束手无策呢?
我们亲爱的老师们口中一个时常提起的词语很关键——思路。对于一个解答,老师可能会做出“思路非常清晰”的评价,想一下,到底什么样算是“思路清晰”呢?
我想,如果我们看到问题,知道该去怎么思考这个问题,在过程中落实自己的想法,就可以说是“思路清晰”了。
下面,笔者将试着从计算机中的一些概念和机制,形象化地浅谈自己对“该如何对问题产生思考”这个问题的理解,不需要具备相关的知识。
试着想想,计算机如何能够存储图像?作为计算机存储内容的核心的晶体管(其他的通讯设备用的可能不是晶体管,但作用和效果还是一样的)只有开、关两种状态,所以计算机只能有顺序地存储0和1。
这就需要试着用0和1来表示一幅图像,或者说把图像翻译成由0和1组成的二进制序列。
你想到解决方法了吗?
如果没有……那我们来想想,怎么可以表示一幅图像?因为要原封不动地存储,所以这种表示应是精确的,不能用色调、画风等宏观概念描述。
图像由什么组成?哦,它可以视为由一群有颜色的点组成。为了方便,它总是被切成规整的矩形。
于是……该如何用0和1表示这些有颜色的点?
首先,可以先解决颜色的表示问题。只用0和1表示颜色的话,可以用0表示黑色,1表示白色,可这样明显色彩不够。怎么办?别忘了,既然有0和1,那我们已经可以表示所有的数字了(所以之后我都用十进制的表示法)。一个数字最多只能表示一种颜色,所以要扩充颜色的种类,就要扩充上下限范围内的数字的个数。于是如果用100表示白的话,1~99便顺理成章地可以表示程度由浅至深的灰色。如果使用1000,我们能得到的灰色将更加细致。
我们的世界里还需要更多彩色。怎么办?再想想,色彩由什么组成?我们突然想起已经忘了长相和姓氏的美术老师(或者是仍然记得长相和姓氏的物理老师)曾经教过我们,可以用三原色(红、绿、蓝)的光来混合出各种颜色的光!利用三原色各自的不同深度配比就可以表示所有的颜色!
很熟悉的感觉不是吗?可以把一个点的颜色分成三部分表示,而因为规定计算机只能有顺序的读取所有这些部分之间必须要有规定的顺序。可以让第一个部分表示红色,第二个部分表示绿色,第三个部分表示蓝色(或者其他顺序),用255当作数字的上限,255,0,0表示红色,于是0,0,0就是黑色,255,255,255是白色(光学中红绿蓝混合是白色),而255,255,0是红绿混合出的黄色!(如果没有规定顺序这将可以表示另两种混合的颜色,会造成歧义)至此,我们已经可以表示几乎所有的颜色。具体是多少种呢?256×256×256种。这便是RGB色彩模式(中的一种)。
可是图像中的这些有颜色的点的空间排布是固定的,于是需要表示每个点的所在位置。这个问题就很简单了,我们可以使用坐标和颜色组合来表示一个点。比如用(0,0),(255,255,0)来代表左上角的点是黄色的,(1,0),(255,0,0)来表示它右边紧挨着的那个点是红色的……以此类推,整幅图可以表示成{((0,0),(255,255,0)),((0,1),(255,0,0)),……}
这固然是一种可行的表示方法,不过这样做其实浪费掉了一些空间,因为没有利用好计算机的读取需要顺序,我们发现用上面的方式的话把元素的顺序打乱也完全可以。
我们可以规定计算机从左上角的点开始读取,之后读取它右边紧挨的点,直到右边的边界,切换到下一行的最左侧点……直到右下角的点读取完成,那时已经完成了所有的点的读取,也就完成了我们的表示。
这样整幅图可以表示成{(255,255,0),(255,0,0),……}不过,比起刚才的方案,这个方案产生了一个额外需要读取的内容,你注意到了吗?
没错,是——什么时候换行,就是图像的宽度(扫描宽度,但它一定是4的倍数,原因不在此涉及)。
还有一个重要的问题,既然说了只能存储0和1,那么就没有可以帮助分隔的“(”、“)”和“,”,这会引发什么问题吗?
答案是肯定的。255的二进制表示是11111111,如果(2,0)处的点我们表示成(255,4,0),就会出现问题。(4的二进制表示是100)
因为没有“(”、“)”和“,”,所以我们实际上记录的是1111 1111 1000(因为方便看所以加了空格,实际不存在),这到底该怎么读取?会不会被读取成“1111”、“1111”、“1000”?总之,这会引发歧义。
实际上,计算机利用对齐机制来解决这个棘手的问题。注意到255的二进制表示是11111111(8位,2的8次方-1)了吗?既然设定颜色分量值的最大值是255,那么这之中的数字占据的空间一定不会超过8位!可以让计算机每次读取8位,而把4记录称00000100,0记录成00000000!
现在再来看我们方法表示的图像:
(扫描宽度)1111 1111 1111 1111 0000 0000 1111 1111 0000 0000 0000 0000 1111 1111 0000 0100 0000 0000 ……
扫描宽度的处理也如此,规定一个最多占用的位数,以免和后面的颜色数据相混淆。
至此,我们已经可以说(*1),我们可以用0和1来表示一幅图像了,但这还不是我的目的所在。
请思考下面的问题:
1、能否构思一种能让计算机存储无声视频的方式?
2、能否构思一种能让计算机存储英文文本的方式?(包括标点符号和空格)
3、能否构思一种能让计算机存储中文文本内容的方式?
相信你一定能够解决这两个问题了。发现了什么吗?是的,你已经可以举一反三地解决问题了!为什么?
我们需要从中总结。
和X元方程组最少需要X个方程才能有确定解类似,想要精确地表示、了解什么必须要有足够的信息。(相似的例子:只知道椭圆的方程和直线的斜率无法确定交点)
想要知道怎么办或为什么,需要知道它的核心是什么(或由什么组成)(比如,灯为什么能发光?为什么电灯需要电才能发光?怎么样能设计出一款能利用太阳能的灯?为什么奇变偶不变?为什么均值不等式中的值不能是负数?是负数还有没有规律?)。
以上,感谢您的阅读。
*1:实际上的图像文件还需要一些内容(比如数据压缩、文件头、信息头的添加,其中扫描宽度是算在信息头里的),不过我们的表示方式对于“只是存储一幅图像”这个要求来说已经足够了。
至于为什么有不同的图片文件格式呢?因为节省空间或网络传输速度的考虑,所以有了压缩数据的要求,不同的格式用途不一样所以压缩的方式也不一样。至于什么是压缩?举个简单的例子,比如一幅纯黄色的图片用{(255,255,0),(255,255,0),(255,255,0)……}来表示很浪费,可以用{宽度,高度,(255,255,0)}来表示,这可以称得上是一种无损压缩。而很多图片的像素点间的规律非常弱,难以采用无损压缩,这时可以使用有损压缩,修改图像来让图像的像素点排布有规律。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值