第一章 电筒密谈
10岁小孩与朋友之间通过手电筒通信:
1. 用光画出字母(缺点:光画出的圈圈杠杠太不准确了)。
2. 字母表的每个字母与一定数目的闪烁相对应,词间的停顿比字母间的停顿时间要稍长一些(优点:不需要挥舞手电筒而是对准某一方向按开关;缺点:需要闪烁的次数过多)。
3. 莫尔斯电码(morse code),长闪烁和短闪烁,点(dot)和划(dash),易于在印刷品上表示。用光通信的时候,10岁小孩的世界里,莫尔斯电码可以让他们达到每分钟接收5~10个单词,虽然仍比交谈慢(交谈大概每分钟100个词左右),但是已经够用了。
图1 手电筒
图2 莫尔斯电码(morse code)
摩尔斯电码由萨缪尔·摩尔斯(1791-1872)发明
什么是编码?
编码或代码(Code)通常指一种在人和机器之间进行信息转换的系统(体系)。
换句话说,编码便是交流。有时我们将编码看成是密码(机密),其实大多数编码并不是的。大多数的编码都需要被很好地理解,因为它们是人类交流的基础。
编码的例子
1. 英语词汇就是一种编码。
2. 用口发音的单词,被称为“口头语言”或“语音”。
3. 对写在纸上(或凿在石头上、刻在木头上或通过比划写在空气中)的词,还有一种编码方式,那就是我们在印刷的报刊,杂志和书籍上看到的字符,称之为“书面语言”或“文本”
4. 对盲人来说,他们可以使用布莱叶盲文(Braille)。这种文字使用凸起的点代表字母,字母串和单词.
5. 手势语言的发明帮助了聋哑人进行面对面的交流。这是一种用手和胳膊的动作组合来表达词语中的单个字母、整个词及其基本概念的语言。
对编码的深入理解:
相互沟通时使用了各种不同的编码的原因:因为在不同的应用场合,其中的一些较其他的更为简便。
例如,语言不能在纸上存储,所以使用了文字;语言、文字不适合用来在黑夜中安静地传递消息,故摩尔斯电码是一个方便的替代品。只要一种编码可以适用于其他编码所不能适用的场合,它就是一种有用的编码。
计算机中使用了不同的编码来传递和存储数字、声音、音乐、图像和视频(电影)。
计算机处理信息都要求使用它们自己的编码方式,正如交谈需要使用人的某些器官(嘴和耳朵),而书写和阅读则需要使用另外一些器官(手和眼睛)一样。
第2章编码与组合
莫尔斯电码解码问题
接收摩尔斯电码并将其翻译回单词比发送费时费力多了,因为译码者必须反向地将已编码的“滴-嗒”序列与字母对应。例如,在确定接收到的字母是“ Y”之前,必须按字母逐个地对照编码表。
问题是我们仅有一张提供“字母→摩尔斯电码”的编码表,而没有一张可供逆向查找的“摩尔斯电码→字母”译码表。
解码问题的抽象:
仅包含一个"滴"或"嗒"的莫尔斯电码序列之可能代表E或T这两个字母之一
. E
- T
两个“滴”或“嗒”的组合则代表了4个字母I、A、N、M:
.. I -. N
.- A -- M
三个“滴”或“嗒”的序列代表了8个字母:
... S -.. D
..- U -.- K
.-. R --. C
.-- W --- O
最后(如果不考虑数字和标点符号的摩尔斯电码),四个“滴”或“嗒”的序列则共代表了16个字母:
图3 四个“滴”或“嗒”的序列
解码表的规律
四张表共包括2 + 4 + 8 + 16 = 30个编码,可与30个字母相对应,比拉丁字母所需的26个字母还多了4个。出于这个原因,在最后一张表中,你可能注意到有4个编码与重音字母相对应。
在翻译别人发送的摩尔斯电码时,上面4张表提供了极大的便利。当你接收到一个代表特定字母的码字时,按其中含有的“滴”“嗒”个数,至少可以跳到其对应的那张表中去查找。
每张表中,全“滴”的字母排在左上角,全“嗒”的字母排在右下角。
你注意到4张表大小的规律了吗?每张表都恰好是其前一张表的两倍大小。这其中包含的意义是:前一张表的码字后加一个“滴”或加一个“嗒“,即构成了后一张表。
可以按下面的方式总结这个有趣的规律:
点划数码字数
1 2
2 4
3 8
4 16
四张表中每张码字数都是前一张的两倍,那么如果第一张表含2个码字,第二张表则含2×2个码字,第三张表2×2×2个码字。以下是另一种表达方式:
点划数码字数
1 2
2 2×2
3 2×2×2
4 2×2×2×2
当然,如果遇到数的自乘,可以用幂表示,例如2×2×2×2可以写成24。数字2、4、8、16分别是2的1、2、3、4次幂,因为可以用依次乘2的方法将它们计算出来。由此我们的总结还可以写成下面的方式:
点划数码字数
1 2^1
2 2^2
3 2^3
4 2^4
这张表简单明了,码字数是2的次方,次方数目与码字中含有的“滴”“嗒”数目相同。
我们可以把表总结为一个简单的公式:
码字数= 2^(“滴”与“嗒”的数目)
为了使译码的过程更为简便,可以画出如下一张树形图:
图4 莫尔斯电码解码规律树状图
解码表的扩展
我们可以加长码字至5位或更长, 5位长的码字又提供了额外的32(2×2×2×2×2)或25个码字。一般而言,这就足够10个数字和16个标点符号使用。实际上,摩尔斯电码中的数字确实是5位的,但在许多其他编码方式中, 5位码字常用于重音字母而不是标点符号。
为了包含所有的标点符号,系统必须扩充至6位表示,提供6 4个附加编码,此时系统可表示2 + 4 + 8 + 1 6 + 32 + 64共126个字符。这对摩尔斯电码而言太多了,以至于留下许多“未定义”的码字。此处“未定义”指不代表任何意义的码字,如果在你接收的摩尔斯电码中有未定义的码字,就可以肯定发送方出了差错。
由于推出了下面这条公式:
码字数= 2^(“滴”与“嗒”的数目)
我们就可以继续导出更长的码字位数所代表的码字数目。很幸运,我们不必为确定码字数目而写出所有可能的码字,我们所要做的不过是不断地乘2而已:
点划数码字数
1 2^1 = 2
2 2^2 = 4
3 2^3 = 8
4 2^4 = 16
5 2^5 = 32
6 2^6 = 64
7 2^7 = 128
8 2^8 = 256
9 2^9 = 512
10 2^10 = 1024
摩尔斯电码被称为二元码(binary code),因为编码中仅含“滴”和“嗒”。这与一个硬币很相似,硬币着地时只可能是正面或反面。二元事物(例如硬币)、二元编码(例如摩尔斯电码)常常用2的乘方来描述.
上面所做的对二元编码的分析在数学上的一个分支—组合学或组合分析里只能算是一个简单的练习。传统上,由于组合分析能够用来确定事件出现的几率,例如硬币或骰子组合的数目,所以它常用于概率统计,但它也同样有助于我们理解编码的合成与分解。