海明码 校验位数公式的理解

#问题

设海明码的校验位数为k,数据位数为x,它们需满足一个位数公式

2^k\geq k+x+1

最初看到公式时我感到很疑惑啊,百思不得其解,主要的问题是最后那个1哪来的。

看着公式望了半天,一点头绪都没有,好脑袋不如烂笔头,于是我开始手写举例试着理解海明码的校验逻辑。

不写不知道,一写吓一跳。写着写着就发现了,原来这个1来的如此妖娆。

#引入(海明码原理介绍)

我们先来复习一下二进制的划分,假设现在有七位二进制数据x_1\rightarrow x_7,用n_1\rightarrow n_7序号来指向。为什么选择七位呢?因为它们的序号刚好可以用三位二进制来表示。


我们再来看看海明码的纠错方法。

表示序号的三个二进制位,每一个二进制位取值为1的序号个数都是4个(图中列标红)。这冥冥之中的平衡一定可以好好利用。

我们分别把二进制3-1列取值为1的序号纳入集合A、B、C。

则集合取值

A={7,6,5,4}

B={7,6,3,2}

C={7,5,3,1}

有一种大家很熟悉,校验一个序列值的方法叫做奇偶校验,偶校验计算方式是序列中所有值异或为0。

如果我们按照A、B、C的集合来分类,每个集合都进行偶校验,就可以得到3个偶校验值,它们需要等于0。由于x_1\rightarrow x_7是固定的,所以A、B、C需要作为校验位参与运算。也就是需满足

A \oplus x_7 \oplus x_6 \oplus x_5 \oplus x_4=0

B \oplus x_7 \oplus x_6 \oplus x_3 \oplus x_2=0

C \oplus x_7 \oplus x_5 \oplus x_3 \oplus x_1=0

根据异或运算的性质,自己与自己本身异或为0。所以可以得到A、B、C的计算公式

A =x_7 \oplus x_6 \oplus x_5 \oplus x_4

B = x_7 \oplus x_6 \oplus x_3 \oplus x_2

C= x_7 \oplus x_5 \oplus x_3 \oplus x_1

海明码考虑的情况是一位纠错。当某一位出错后,A、B、C和它们对应集合数据位的异或就不再是本身与本身的异或,并且最终结果会变为1。

也就是说,接收到数据后,若A \oplus x_7 \oplus x_6 \oplus x_5 \oplus x_4=1,则表示A对应集合有一位元素数据位出错了(集合对应的元素就是一列中二进制表示为1的元素)。同理,最后运算结果为0的集合对应的元素是没有问题的,这样就可以筛查出是具体哪一位元素出错,从而进行纠错。

比如n_5出错,那么A=1代表第一列元素出错,B=0代表第二列元素没错,C=1代表第三列元素出错。满足所有交集的元素只有一个,也就是被筛查出来的n_5。可以看见这种方法非常直接,因为将ABC排列成二进制数,所代表的序号就是出错的那一位。

如下图,红色方块代表本列有出错元素,A列确定了n_7,n_6,{\color{Red} n_5},n_4,C列确定了n_7,{\color{Red} n_5},n_3,n_1,交集{\color{Green} n_7},{\color{Red} n_5};而绿色方块代表一定没有出错的元素,B列排除了{\color{Green} n_7},n_6,n_3,n_2。随后n_5就被筛选出来了。

#探明

在上面讲述海明码纠错过程中,可能有同学已经发现问题所在了。

我们新增了三位校验位,可是只对七位数进行了纠错。

所以公式里的那个1,其实来自于我们没有画出的序号0!

我们回望A、B、C的分类,每一集合都有4个元素,看似非常规律,似乎冥冥之中决定了我们可以使用海明码这样的纠错方式。

偏偏卦不可算尽,虽然每集合都有4个元素,但元素的分布律不是均等的,不仅不是均等的,还遗漏了一个0。

所以k个校验位,虽然能表示2^k个序号,但最终只能带来2^k-1的纠错能力。

同时我们需要将校验位加入传输数据,也就是真正的有效数据x需满足x+k\leq 2^k-1


#ps 会什么会少一个呢?其实很简单,只要理清楚概念。k个校验位,输出的序列(比如ABC),含义是第ABC(二进制)个序号的数值有错,而不是总共有多少个数字之类。所以看看000代表的含义就知道少掉的一种情况去哪了——它代表序列校验正确。

#pps 海明码校验位的位置在这个问题上没有啥作用,最初我觉得它一定有什么深层含义,想了半天也没想出什么

#ppps 或许以后有时间还可以写篇博客,叫做《海明码的哲学原理》。

 

 

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值