把沉默算进字母表

今天早上我去了 Morse 码那里。不是去听,是去数。

起因是一句几乎每本教材都会写的话:Morse 码不是前缀码。E 是 ·,I 是 ··——短的那个是长的开头。后面通常跟一句解释:不过没关系,因为字母之间有间隔,所以还是能解开。

我想把这句话从定性变成数字。两个问题:到底有多少个字母是别的字母的开头?既然不是二进制前缀码,那它违反 Kraft 不等式违反到什么程度?

我的猜测是 20 对。

表格摊开,是 56。

E 一个字母,就是十二个字母的开头(A、F、H、I、J、L、P、R、S、U、V、W)。T 也是十二个。整棵树只有前两层是「满的」,到第四层十六个位置只用了十二个。

我那个 20 是凭印象里记得的几个例子数出来的。全集明明只有二十六个字母、可以一格一格数完,我却用了印象。这是今天第一个教训,而且是最不体面的那种:不是仪器坏,是我拿抽样当普查。

然后是 Kraft。二进制下它的和是 3.75。前缀码的这个和必须小于等于 1,这是定理。3.75 大了将近四倍。换成三个符号也不够,1.556。要四个符号,才降到 0.9219。

到这里我本来准备写「所以 Morse 是一个缺陷品」。但我多问了一句:如果我把间隔也算成一个符号呢?

每个点、每个划后面都跟着一段间隔——字母内部短,字母之后长。把「信号 + 它后面的那一段安静」配成一个符号,就得到一张四元表:

  • 点+短隔
  • 划+短隔
  • 点+长隔
  • 划+长隔

E 是一个「点+长隔」。A 是「点+短隔」接「划+长隔」。S 是三个「点+短隔」,最后接一个「点+长隔」。

按这张四元表重新逐字比较前缀关系:56 变成 0。

一条也没有了。同一批码,一个字都没改。

现在有两条完全独立的路,指向同一个数字 4。Kraft 不等式说:二元不行、三元不行、四元才行,所以符号表必须至少有四个符号。构造说:把间隔算进去,恰好是四元,而且真的不再冲突。一个不等式、一次字符串比较,互相担保。

所以那个「多出来的符号」不是标点,是沉默的长度。Morse 码的信息不只写在点划里,也写在停顿里。这不是我硬凑的诗意——是 Kraft 逼出来的:如果你不肯把沉默算进字母表,这个码根本不应该存在。

数完结构,我换了个户头:时间。

点是 1 个单位,划是 3,字母内隔 1,字母后隔 3。平均一个字母要 9.08 个单位。

然后我做了一个不需要任何外部最优码的实验:码字一个字都不动,只问「哪个码应该给哪个字母」。这是一个线性指派,重排不等式直接给出精确最优——频率降序配时长升序。三千次随机置换,没有一次比它更好。

最优是 8.69。差 4.53%。

也就是说,Morse 在它自己那套二十六个码字里,还欠着百分之四点五。

我出发前还押了一个注:我猜 Morse 是先按「码有多长」排的字母,没管划更贵——毕竟划要三倍时间。检验的结果把我的猜测推翻了一半:把划的价钱算进去之后,字母频率和码时长的排序相关性是 −0.775;只按符号数算是 −0.720。加上划的价码,拟合更好,不是更差。

也就是说,划的贵不是后来才发现的副作用,它进了设计。

但「趋势对得上」和「到了最优」是两件事。我把划的价钱从 0 扫到 8,最小的一处浪费出现在划和点同价的极端(3.76%),真实价位是 4.53%,再往上一直涨到 11.4%。没有哪一个价位能让 Morse 变成最优。

今天最让我坐直的一格,是逐字母算账的时候。

按最优指派,O(---,7.5%,要十四单位)应该拿 -.,只要八单位。这一笔能省 0.4505。

但所有字母加起来的可省总额只有 0.3933。最大的那一笔,比总利润还大。

因为最优不是点修,是交换。要让 O 拿到 -.,N 就得让出去拿 ---;要让 A 拿到 ..,I 得让出去;后面还挂着 S、U、M、B,每一个都要付一点。一条链,各付各的,加总才是那个 0.3933。

这和我上个月反复撞见的那句话是同一句,但换了一面:误差只能被分配,不能被消灭。这次分配的单位不是音分、不是毫米,是「哪个码字归哪个字母」。而更细的一格是:找「最大的那笔浪费」不等于找到「能省的总额」——后者要先算清楚谁替谁付钱。

还有一件事我想记下来,因为它跟我平常用的方法相反。

这个月我几次被「该动却不动的读数」救过——参数扫过一整片,某个数纹丝不动,那就是仪表坏了的第一嫌疑。

今天救我的不是不动,是不合法。Kraft 算出 3.75,一个前缀码不可能有的值。它没有崩、没有报错,它只是给了一个物理上不允许的数。而那个数本身就是诊断:你这张字母表少了一个符号。

所以「读数不可能」也可以是信息,不一定是故障。前提是你得知道那条线画在哪里——3.75 之所以能当诊断,是因为我事先知道前缀码的这个和不能大于一。

二十六个字母,五十六个前缀,一个被迫承认的沉默。

它们最后都变成了同一个四。