从海明校验码深入了解

首先,海明校验码的学习看视频没看明白,看了博客有所感悟
1、海明校验码不是万能的,根据信息论也知道不可能

写在海明校验码之前

海明校验码的原理和我之前遇到的一道题目很像,10只老鼠试验1024瓶药是否有毒
有1024瓶药,其中已知有1瓶且只有1瓶有毒,老鼠吃了毒药1h之后会死亡,现在有10只老鼠,给你1h时间,找出那瓶毒药(不考虑老鼠喝药之间,只需要考虑药效时间,意思就是一次性找到,而不是分多次尝试)
1、信息论上有这么个知识,老鼠喝药之后有2种可能性,活着或死掉,10只老鼠的生或死,总共有多少种可能性呢,2的10次方,就是1024,而药恰好1024瓶,根据信息论,存在一种方案,可以仅通过一次校验,就能找到那瓶毒药
2、方案就是:将1024瓶药按0-1023进行编号,按二进制进行展示就是从0000000000至1111111111,第一只老鼠需要喝第一位为1的药,第k只老鼠喝第k位为1的药,可怜的老鼠,每只要喝512种药
3、根据1h后死掉的老鼠,就可以知道哪瓶药有毒,比如第1、3、5、7只老鼠死掉,有毒的就是第1010101000瓶,如果第0000000000瓶药有毒,那就是最幸运,所有老鼠都活着,最不幸的就是1111111111号有毒

简单的校验码
比如身份证号的最后一位,就是一个校验码,将前17位数字进行某种计算,对11取余,对于11种结果(0-9和X)
二进制中,可以对前面数字的和对2取余
使用单数字进行取余有什么不足?
1、如果有2位有变动,就会误以为是正确结果
2、就算知道错了,也无法进行纠错

奇偶校验
奇校验:这串序列1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0
偶校验:这串序列1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0

什么是海明校验码?
1、选出哪些试药的小白鼠,2的k次方位,二进制表示就是 1、10、100、1000…
2、其他非校验位位置,根据自己的位置编号,明确自己要参与到哪些位置的计算,如位置位10101的,要参与10000、00100、00001的计算
3、校验位根据需要校验的数字,进行奇偶校验,得到数值

根据原理得到的
1、因为使用奇偶校验,如果某一位错了两回,等于没错,所以可以进行1位的纠错,2位的检测错误,3位及以上的错误不一定能查到,如 011、101、110错了,那恰好校验都能通过(都是错两回,等于没错)[出错概率很低,这么出错概率更低]
2、位数越长,海明校验码的占用比例越低,可以验证的位数相对于海明校验码的数量是指数级增长的

举例
需要将1010 1000 0101加上海明校验码

1、数位数,总共是12位,需要5位海明校验码。(2^4-4-1=11,所以4位海明校验码不够)
2、将海明码填充??1?010?1000010?1
3、将数值为1的位置进行2进制表示
00011
00110
01001
01110
10001
进行偶校验得到
10011
进行填充
11100100100001011

写在最后

学习越久,越觉得算法有用,之前的跳表的算法题,和这次海明校验码,没有良好的算法基础,真的很难理解
博观而约取,厚积而薄发。

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