1. 程式人生 > >理解海明碼

理解海明碼

今天做題遇到了海明碼,網上相關知識很多,可惜大多都要把知識點看透才能明白海明碼到底是什麼,這裡我整理自己的學習過程和理解。

海明碼初步

首先海明碼是一種校檢碼,數位中包括資料位和校檢位,是奇偶校檢碼的升級。
假設讀者對奇偶校檢碼很熟悉,它只能指出某組資料是否出錯,但是無法確定出錯的位置。海明碼則通過多增加幾個奇偶校檢位,相互關聯,進而找出出錯的位置。當然以上分析都假定出錯只會發生一次,也就是說一組資料最多隻有一個地方出錯。
“互相關聯”是什麼意思?這東西很神奇,繼續往下看。

如果單純看教材,書本上首先映入眼簾的是,已知原始資料為k位,求需要的海明校檢碼的位數r,直接給出公式k+r≤r^2-1。這太違背學習軌跡了。我們重頭來。
原始資料k位,海明碼r位,意味著一組資料是k+r位,重點:資料傳輸中出錯,並不一定是資料位裡的k位出錯,校檢位r位也有出錯的可能性

,為了能夠找到出錯的具體位置,我們首先羅列所有的情況
①資料沒有出錯。情況數 1
②資料出現1位錯誤。情況數 k+r
③有多位出現錯誤,不予考慮
可見一共有(k+r+1)種情況。
再考慮充當檢校的r位,它們的0/1組合,一共可以組成r^2種情況(00…0~11…1,r個2相乘)。所以為了涵蓋上述的出錯情況,真正有意義的公式應該寫成
k+r+1≤r^2
這裡先放下不表。

其二,檢校位的擺放位置
從本質上來說隨便放哪裡都可以,但是為了不同機器、軟體的相容,以及生成、檢校演算法實現的方便,採用如下方式插入檢校碼。

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 資料1 檢校3 資料2 資料3 資料4 檢校4 資料5 資料6 資料7 資料8

表格第一排是原始資料和檢校位合併後總資料位,從左到右升序,以1起頭。第二排是檢校位和(原始)資料位的擺放位置。
先找規律,開頭兩位都是檢校位,第i個檢校位,位於總位數(i-1)^2的位置處,如第4個檢校位,位於總數位的8。
其他空格的地方是(原始)資料位。

可以理解成,檢校位先固定了位置,(原始)資料再插入其中
原來是資料位“插”檢校位中,而不是一開始認為的檢校位“插”資料位中,當然這只是一種理解方式。例如:
我需要傳輸1位資料,那就插到3號位,總資料位數為3,檢校位數目2個。
我需要傳輸2位資料,那就插到3和5號位,總資料位數為5,檢校位數目2個。
… …
我需要傳輸5位資料,那就插到3、5、6、7、9號位,總資料位數為9,檢校位數目4個。
… …

其三,檢校位的值的確認
每個檢校位裡面填0還是1的問題。繼續看錶

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 資料1 檢校3 資料2 資料3 資料4 檢校4 資料5 資料6 資料7 資料8
檢校1子序列 O O O O O O
檢校2子序列 O O O O O O
檢校3子序列 O O O O O O
檢校4子序列 O O O O

對於檢校i位,它從自己開始,按照取i位數,跳i位數輪流的方式得到子序列,在子序列中,按照奇偶校驗的方式確定自己的值。

例如下面的資料,原資料為101101,共5位,分別插入第3、5、6、7、9位中,組成一個9位的總資料。現在要確認檢校位的取值,假設為奇校驗法。

1 2 3 4 5 6 7 8 9
檢校1 檢校2 資料1 檢校3 資料2 資料3 資料4 檢校4 資料5
1 ? 1 1 0 1

我們開始找每個檢校位對應的子序列
檢校1,從自己開始,取1跳1。即?1101,按奇校驗方式,檢校1=0。
檢校2,從自己開始,取2跳2。即?110,因此檢校2=1。
檢校3,從自己開始,取3跳3。即?11,因此檢校3=1。
檢校4,從自己開始,取4跳4。即?1,因此檢校4=0。
所以整個資料為0111 1100 1

海明碼檢校方法

仔細看這張表。再結合上面以子序列確定對應檢校位的數字分析。

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 資料1 檢校3 資料2 資料3 資料4 檢校4 資料5 資料6 資料7 資料8
檢校1子序列 O O O O O O
檢校2子序列 O O O O O O
檢校3子序列 O O O O O O
檢校4子序列 O O O O

可以發現這樣的規律——
當總資料位1號出錯,“檢校1”的奇偶校驗能報告異常,例如上面的例子,傳輸資料“0111 1100 1”,接受為“1111 1100 1”時,校驗1 的子序列此時為“11101”,奇校驗異常(偶數個1)

其他具體分析略。結論:當總數位的i位出錯時,表中對應有圈圈的檢校位就會報錯,而且這種報錯方式是唯一的,例如當只有檢校2和3報錯時,那麼一定是6號資料出錯(也就是原始資料的第3位)

也就是說,這種報錯和出錯位置的是一一對應的,是不是對公式k+r+1≤r^2有了更深的理解呢?

海明碼只能檢測1位錯誤

大家先想想是不是這樣的。

例如1、2號位同時出錯,查表得,檢校1和2會同時報錯,這和單獨3號位出錯的報錯方法一致。導致系統認為出錯的是3號位,因此1改0,0改1。

再比如5、7號位同時出錯,查表,這時檢校1和3會報錯,而檢校2因為錯了兩次,錯錯得正,反而不報錯。最後系統認為5號位出錯。

還好一般多位出錯的情況極其罕見。當然在通訊極其惡劣的場合,海明碼也沒得救。

(碎碎念:當時看書,覺得這東西真複雜,沒想到弄懂了也挺有趣的)