編碼的奧秘 編碼與組合

2021-08-31 13:30:19 字數 3512 閱讀 6174

**:《編碼的奧秘》第二章

摩爾斯電碼由薩繆爾·摩爾斯( 1 7 9 1 —1 8 7 2)發明,本書後面會在多處提到他。摩爾斯電碼是隨著電報機的發明而產生的,電報機我們以後也還要做詳盡的說明。正如摩爾斯電碼很好地說明了編碼的本質一樣,電報機也提供了理解計算機硬體的良好途徑。

大多數人認為摩爾斯電碼的傳送易於接收,即使你沒有記住摩爾斯電碼,也可以方便地借助下面這張按字母順序排列的表傳送:

接收摩爾斯電碼並將其翻譯回單詞比傳送費時費力多了,因為解碼者必須反向地將已編碼的「滴-嗒」序列與字母對應。例如在確定接收到的字母是「 y」之前,必須按字母逐個地對照編碼表。

問題是我們僅有一張提供「字母→摩爾斯電碼」的編碼表,而沒有一張可供逆向查詢的「摩爾斯電碼→字母」解碼表。在學習摩爾斯電碼的初級階段,這張解碼表肯定會提供很大的便利。然而,如何構造解碼表卻毫無頭緒,因為我們似乎無法找出這些按字母順序排列的「滴-嗒」序列的規律。

那麼忘記那些字母序列吧,也許按照碼字中「滴」「嗒」的個數來排列會是個更好的嘗試。例如,僅含乙個「滴」或「嗒」的摩爾斯電碼序列只可能代表 e或t這兩個字母之一:

兩個「滴」或「嗒」的組合則代表了 4個字母i、 a、 n、 m:

三個「滴」或「嗒」的序列代表了 8個字母:

最後(如果不考慮數字和標點符號的摩爾斯電碼),四個「滴」或「嗒」的序列則共代表了 1 6個字母:

四張表共包括2 + 4 + 8 + 16 = 3 0個編碼,可與 3 0個字母相對應,比拉丁字母所需的 2 6個字母還多了 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可以寫成 2 4。數字 2、 4、 8、1 6分別是 2的 1 、 2、 3 、 4次冪,因為可以用依次乘 2的方法將它們計算出來。由此我們的總結還可以寫成下面的方式:

點劃數         碼字數

1                   2¹

2                   2²

3                   2³

4                   2^4

這張表簡單明瞭,碼字數是 2的次方,次方數目與碼字中含有的「滴」「嗒」數目相同。我們可以把錶總結為乙個簡單的公式:

碼字數 = 2 ^(「滴」與「嗒」的數目)

很多編碼中都用到 2的冪,在下一章中我們會看到另乙個例子。

這張表表示出了由「滴」與「嗒」的連續序列得出的字母。解碼時,按箭頭所指從左到右進行。例如,你想知道電碼「滴-嗒-滴」代表的字母,那麼從最左邊開始選擇點,沿箭頭向右選擇劃,接著又是點,得出對應的字母是 r,它寫在最後乙個點的旁邊。

如果認真考慮,會發現事先建立這樣一張表是定義摩爾斯電碼所必需的。首先,它保證了你不會犯給不同的字母相同碼字的錯誤!其次,它保證你使用了全部的可用碼字,而沒有使「滴」與「嗒」的序列毫無必要的冗長。

我們可以加長碼字至 5位或更長, 5位長的碼字又提供了額外的 3 2( 2× 2× 2× 2× 2或2 5)個碼字。一般而言,這就足夠 1 0個數字和 1 6個標點符號使用。實際上,摩爾斯電碼中的數字確實是 5位的,但在許多其他編碼方式中, 5位碼字常用於重音字母而不是標點符號。

為了包含所有的標點符號,系統必須擴充至 6位表示,提供 6 4個附加編碼,此時系統可表示2 + 4 + 8 + 1 6 + 3 2 + 6 4共1 2 6個字元。這對摩爾斯電碼而言太多了,以至於留下許多「未定義」的碼字。此處「未定義」指不代表任何意義的碼字,如果在你接收的摩爾斯電碼中有未定義的碼字,就可以肯定傳送方出了差錯。

由於推出了下面這條公式:

碼字數 = 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的乘方來描述。

上面所做的對二元編碼的分析在數學上的乙個分支—組合學 或組合分析 裡只能算是乙個簡單的練習。傳統上,由於組合分析能夠用來確定事件出現的機率,例如硬幣或骰子組合的數目,所以它常用於概率統計,但它也同樣有助於我們理解編碼的合成與分解。

編碼的奧秘

文字檔案解析 文字檔案對應於人類可以閱讀的文字,如何從2進製轉換為文字檔案呢?起初由於計算機在美國發明,自然大家考慮的是英語如何表示,英語字母總共26個,加 上特殊字元,128個字元,7位既乙個byte即可表示出來。這個就是大家所熟知的ascill編碼。對應關係很簡單,乙個字元對應一乙個byte。但...

編碼的奧秘

c語言 乙個常量與乙個變數相加 i i 5 在c語言中,可以簡寫為 i 5 如果只需要把變數加1 即增量 簡寫語句 i 1,布林陣列從2 10000的所以數字來演算法 begin boolean array a 2 10000 integer i,j for i 2 step 1 until 100...

字元編碼的奧秘

字 符編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 ...