理解海明码

今天做题遇到了海明码,网上相关知识很多,可惜大多都要把知识点看透才能明白海明码到底是什么,这里我整理自己的学习过程和理解。

海明码初步

首先海明码是一种校检码,数位中包括数据位和校检位,是奇偶校检码的升级。
假设读者对奇偶校检码很熟悉,它只能指出某组数据是否出错,但是无法确定出错的位置。海明码则通过多增加几个奇偶校检位,相互关联,进而找出出错的位置。当然以上分析都假定出错只会发生一次,也就是说一组数据最多只有一个地方出错。
“互相关联”是什么意思?这东西很神奇,继续往下看。

如果单纯看教材,书本上首先映入眼帘的是,已知原始数据为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

海明码检校方法

仔细看这张表。再结合上面以子序列确定对应检校位的数字分析。

扫描二维码关注公众号,回复: 4698404 查看本文章
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号位出错。

还好一般多位出错的情况极其罕见。当然在通讯极其恶劣的场合,海明码也没得救。

(碎碎念:当时看书,觉得这东西真复杂,没想到弄懂了也挺有趣的)

猜你喜欢

转载自blog.csdn.net/zrxrzrx/article/details/84261533