史上最通俗的海明码编码计算、检错和纠错原理解析

合法代码集

所谓合法代码集就是当代码由于未知因素导致出错后,计算机可是识别到错误的代码。不合法代码集:{(001), (010), (101), (111)}。如果(101)出错,可能是(111),那么无法判断是错误代码还是本来就是(111),因此不合法。下面给出合法代码集:{(001),(100), (111)},当有一位发生变化时并不会和代码集中的其他代码发生冲突,因此合法。

编码的最小距离

合法代码集中任意两组合法代码之间二进制位数的最少差异。编码的检错、纠错能力与编码最小距离直接相关,公式描述为:L-1 = D+C(D>=C)

L: 编码的最小距离
D: 检错的位数
C:纠错的位数

汉明码

具有一位纠错能力的编码方案,实质上是使用特殊分组方式的奇偶校验。

奇偶校验

假定需要传输的数据是“00100011”,那么在原数据加上一个校验位,使得“1”的个数是偶数个:“100100011”。当传输到另一端的时候,检查“1”的个数是否是偶数个,如果还是偶数,那么表示没有错误,否则就是失效的数据。

带分组的奇偶校验

为了更加精确的定位出错的二进制位,那么可是将二进制位分组,将“00100011”分成“0010”和“0011”,分别在两个分组前加上一个校验位:“10010”和“00011”,这就构成了“1001000011”,发送到对方的时候,将每个分组的“1”查找一遍,然后考察是否是偶数个,即可更加精确的定位到是哪个分组出错。

汉明码的编码

上边说的都是基于划分的分组方式,汉明码是基于非划分的分组方式。假定存在如下数据位:

在这里插入图片描述

我们将这个长度的代码分成3组,每组包含1个校验位,总共包含4个数据位,如下图所示:

史上最通俗的海明码编码计算、检错和纠错原理解析_第1张图片

将3个组分别命名为Group1、Group2、Group3,那么将会产生三个校验位结果:

Group3 Group2 Group1 Result
0 0 0 没有错误
0 0 1 Group1中有错误,1的位置出错.
1 0 1 Group1和Group3公共区域出错,5位置出错.

既然有了校验位,那么这些校验位应该放到哪里呢?我们上面将数据按位划分了组:

Group1: {1, 3, 5, 7};
Group2: {2, 3, 6, 7};
Group3: {4, 6, 6, 7}.

实际上,我们的分组方式就是按照汉明码的编码规则划分的,因此要考察每个分组的特征:

Group1: {1, 3, 5, 7};
Group2: {2, 3, 6, 7};
Group3: {4, 6, 6, 7}.

显然,应该放到2n-1位。

如果是二进制代码的话产生的校验值会有如下特征:

Group1:xxxx1
Group2:xxx1x
Group3:xx1xx
Group4:x1xxx

从右向左,如果Group1的第一位是1,表示Group1独有的比特位出错。如果是Group1的第一位和Group4的第四位同时是1,表示Group1和Group4共有且其他组没有的比特位出错。综上所述,汉明码总共有三个要素:

  • 汉明码的组成需要添加多少位校验位

    因为每个组都有一个校验位,所以多少个校验位就是多少个组,设校验位包含k位,原始数据比特位有n位,在加上一种没有错误的情况,因此是2^k >= n+k+1(和画图一样的道理)。

  • 校验位在整个编码中的位置

    2^(n-1)

  • 校验位的取值

    根据采用的是奇校验还是偶校验有关。

汉明码使用交替跳跃的方式选择每个组中应该包含的比特位,比如:
Group1:选取1位,跳跃1位;
Group2:选取2位,跳跃2位…
汉明码的校验:
Group1 = 1⊕3⊕5⊕7
Group2 = 2⊕3⊕6⊕7

测试题:求“0101”按照偶校验配置的汉明码
原始数据长度n = 4; 分组个数:k = 3; 汉明码排序:

比特位序列 1 2 3 4 5 6 7
汉明码 C1 C2 0 C4 1 0 1

下面是每个分组的情况:
C1分组情况:

1 3 5 7
C1 0 1 1

C1分组已经有偶数个“1”,因此C1 = 0;同理,C2 = 1; C4 = 0。
因此,汉明码为:“0100101”。

本文来自我的51CTO博客:http://blog.51cto.com/xvjunjie/2339014

你可能感兴趣的:(算法分析)