海明码…………
我这两天可算给它折磨的死去活来。
现在稍微谈谈这个玩意的工作机制。
那先得谈谈奇偶校验码。
一串二进制信息如下。
10101010
在前面放置一个1,使其变成110101010,有奇数个1,这就是奇校验方法。
同理加个零,使有偶数个1,这就是偶校验。
当然,计算机这么算太复杂,咱们直接粗暴一点。
令所有信息位“异或”,同0异1,诸如上述二进制信息异或得0,放在首位,就形成校验码了。
奇偶校验码是为了检错而生的。检错机制就是所有信息再次异或(包括校验位),这样一来,如果假设没有出错,那么等于原本信息位自己跟自己再一次异或,因为校验位就等于信息位异或得结果,那不肯定就是0了。
从这个角度来看,奇偶校验码对计算机而言没有奇偶,奇偶只是对人来讲的。
所以当所有信息异或之后结果出现了1而不是0,那么就发生比特错了。
但是咱们无法知道具体在哪一位错,而且当偶数位差错出现的时候,也是没有办法检测的。
这就是奇偶校验码的局限性。
我想纠错怎么办?
其实海明码在我看来就是分组的奇偶校验码。
大家先感性的理解一下这个事情。
我把一批数据拆分成多批数据,注意嗷!我可不是乱分的!我是有bear来!
怎么分?不是说拆分,而是像这样。比如第一组是1,2,3,4(指数据在第几位上)位
第二组就是1,2,5,6。
第三组就是1,2,4,5。
(都是假设,不是具体的海明码分组方法)
那这样,就好比是对口供找内奸!
假设我第一组没问题第三组没问题偏偏第二组出了问题,你说内奸是谁?
好,我们传统校验码是讲究加校验位的,那谁知道你校验位有没有出错?
所以对于校验位也要进行检测,也要对口供!不能漏掉一个。
所以,分组的时候,两个分组之间的信息部分要有部分重叠,而校验码自然是不能重叠的,一个码管两个组我看管不过来。
但是这个校验码还得尽可能少加,因为要讲究效率的。
那么分组如何分?能不能你的分的少我这里分的多?
不行,都是校验码,怎么能如此厚此薄彼?
最好啊,这种分组,两两之间数据重复的最多,这样子才可以更有效的抓捕叛徒!
综上。
其实可以转化为另一个问题,就好比是一个个圆,代表一个个分组,让他们相交,然后把平面分成很多的小区域,这样就保证了组与组之间数据尽可能大的重复以及能用最少的分组存最多的数据。
那么平面究竟能被k个圆分成多少个区域?
答案是2^k个。
我们可以这么思考,一个区域,必会是由多个圆相交而产生的。一个区域如果是在一个圆内就记做1,不在就记做0,那么考虑到k个圆,就有2^k个情况,这一串k位的二进制数就合理的描述了区域的特性。而这种特性在此题之中可以唯一且只能唯一确定一个区域,他们是一一对应关系。
所以,对于k个分组我们有。
2^k个区域。
其中00000…………001000……00,代表了一个区域只在一个圆内,我们有k种取法,这样就是选出了用来监督的人。
还有就是全0的取法,这个是外部空间,不放数要去掉。所以大家目前可以用的空间,2^k-1-k个空间用来储存数据。
但是这些空间代表着你可以放数的上限值,实际上的数据量可能没这么大。
所以,2^k-1-k>=n;
就出来了那个著名的海明不等式了。
咱们有n+k个数据,有k个分组,每个分组异或之后得到的要么是0,要么是1。
n+k最大值是2^k-1,而k个分组的01值可以有2^k种组成。
那么就是说,对于一比特的错误,比特的错误位置是完全可以通过分组异或结果01值组成的二进制信息指示出来的。这是可以一一对应的。
可以通过具体的合理的方法使其更直观一些,这些就是书上给出的海明码编码方法了。我就不再多说。
当所有分组异或值为0时,代表没有错。
这是出现一位错的情况。
当出现两位错呢?
海明码无法进行两位错的纠正。
或者如何判断一定是一位数错了而不是两位错误呢?
我们可以对全局进行偶校验。
这位校验码是作为“信息”加入到比特串尾部的,所以要先进行海明校验再偶校验。
如果全局校验成功,那么代表信息无错或者出现了偶数位错误。
失败就代表着出现了奇数位错误。
所以,如果我们海明校验成功且全局校验也成功那自然皆大欢喜。
海明校验失败全局校验成功,那么我们出现了偶数位错误,也就是两位错误呢?没办法,神仙难救,直接回炉重造吧,重发一遍。
海明校验失败且全局校验也失败,说明出现了奇数位错误,那么肯定是一位错误,直接改就成。
啥?你跟我说两位以上怎么办?
不不不,脑壳痛,不想思考了。
ouo!!!!