讓我們嘗試總結(jié)一下這個壓縮算法。我們用縮寫b代替“back”,c代替“copy”。因此一個如“back 18,copy 6”(數(shù)回18個字母,抄到第6個字母)的返回抄寫指令簡寫為b18c6。因此上面的口述指令可以被總結(jié)成:
VJGDNQMYLH-KW-b12c10-ADXSGF-O-b17c16-b16c10-EW-b18c6
這個字符串只包含44個字母。原始字符串有63個字母,我們節(jié)省了19個字母,接近原始字符串長度的1/3。
同前把戲中還有一個有趣的竅門。你會如何使用相同的把戲壓縮FG-FG-FG-FG-FG-FG-FG-FG這條消息?(和之前一樣,破折號不是消息的一部分,只是為增強可讀性而添加。)消息中的FG有8處重復(fù),因此我們可以單個口述前4個,然后使用如下的返回抄寫指令:FG-FG-FG-FG-b8c8。這會節(jié)省不少字母,但我們可以做得更好。這需要一個第一眼看起來可能顯得荒謬的返回抄寫指令:“back 2, copy 14” (數(shù)回2個字母,抄到第14個字母),或簡寫為b2c14。壓縮的消息就成了FG-b2c14。在只有2個字母可供抄寫的情況下,怎么理解抄到第14個字母呢?事實上,只要你從重新生成的消息中而非壓縮的消息中抄寫,就不會有任何問題。讓我們一步步地來做。在口述了最開始的2個字母后,我們有了FG。然后我們收到b2c14指令,于是我們數(shù)回2個字母并開始抄寫。因為只有2個字母(FG),讓我們抄寫這2個字母:當(dāng)把抄寫的字母加到我們已有的字母后,結(jié)果是FG-FG。但現(xiàn)在多了2個字母!照樣抄寫這些字母,在將它們添加到已有的重新生成的消息上之后,你得到了FG-FG-FG。和前一次一樣,又多出2個字母,于是你又能多抄寫2個字母。依此類推,直到你抄寫了所要求的字母數(shù)(在這個例子中就是14個)。要檢驗自己是否理解了這一點,看看你能否得到這條壓縮消息的解壓版:Ab1c250 。
更短符號把戲
要理解名為“更短符號把戲”的壓縮把戲,我們要更深入探究計算機存儲消息的方式。你之前可能聽說過,計算機并不真的存儲a、b、c這樣的字母。所有東西都以數(shù)字存儲,然后根據(jù)一些固定表格翻譯為字母。(這種在字母和數(shù)字之間轉(zhuǎn)換的技術(shù)在校驗和的討論中有提到。)比如,我們可以同意“a”由27代表,“b”由28代表,“c”由29代表。那么字符串“abc”就可以以“272829”的形式存儲在計算機中,而在屏幕上顯示或打印在紙上之前,這些數(shù)字又能輕易翻譯回“abc”。