版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
今天做题遇到了海明码,网上相关知识很多,可惜大多都要把知识点看透才能明白海明码到底是什么,这里我整理自己的学习过程和理解。

海明码初步

首先海明码是一种校检码,数位中包括数据位和校检位,是奇偶校检码的升级。
假设读者对奇偶校检码很熟悉,它只能指出某组数据是否出错,但是无法确定出错的位置。海明码则通过多增加几个奇偶校检位,相互关联,进而找出出错的位置。当然以上分析都假定出错只会发生一次,也就是说一组数据最多只有一个地方出错。
“互相关联”是什么意思?这东西很神奇,继续往下看。
如果单纯看教材,书本上首先映入眼帘的是,已知原始数据为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数据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数据1检校3数据2数据3数据4检校4数据5数据6数据7数据8…
检校1子序列OOOOOO…
检校2子序列OOOOOO…
检校3子序列OOOOOO…
检校4子序列OOOO…

对于检校i位,它从自己开始,按照取i位数,跳i位数轮流的方式得到子序列,在子序列中,按照奇偶校验的方式确定自己的值。
例如下面的数据,原数据为101101,共5位,分别插入第3、5、6、7、9位中,组成一个9位的总数据。现在要确认检校位的取值,假设为奇校验法。

检校1检校2数据1检校3数据2数据3数据4检校4数据5
??1?110?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数据1检校3数据2数据3数据4检校4数据5数据6数据7数据8…
检校1子序列OOOOOO…
检校2子序列OOOOOO…
检校3子序列OOOOOO…
检校4子序列OOOO…

可以发现这样的规律——
当总数据位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号位出错。
还好一般多位出错的情况极其罕见。当然在通讯极其恶劣的场合,海明码也没得救。
(碎碎念:当时看书,觉得这东西真复杂,没想到弄懂了也挺有趣的)