理解海明碼
今天做題遇到了海明碼,網上相關知識很多,可惜大多都要把知識點看透才能明白海明碼到底是什麼,這裡我整理自己的學習過程和理解。
海明碼初步
首先海明碼是一種校檢碼,數位中包括資料位和校檢位,是奇偶校檢碼的升級。
假設讀者對奇偶校檢碼很熟悉,它只能指出某組資料是否出錯,但是無法確定出錯的位置。海明碼則通過多增加幾個奇偶校檢位,相互關聯,進而找出出錯的位置。當然以上分析都假定出錯只會發生一次,也就是說一組資料最多隻有一個地方出錯。
“互相關聯”是什麼意思?這東西很神奇,繼續往下看。
如果單純看教材,書本上首先映入眼簾的是,已知原始資料為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號位出錯。
還好一般多位出錯的情況極其罕見。當然在通訊極其惡劣的場合,海明碼也沒得救。
(碎碎念:當時看書,覺得這東西真複雜,沒想到弄懂了也挺有趣的)