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