前段时间在计算机组成原理的专业课中学习到了汉明码的校验过程,不禁回想起之前看到的一道通过小白鼠测试毒试剂的经典面试题,发现这个测试过程实质上就是汉明码的校验过程
面试题:8个试剂,其中一个有毒,有三只小白鼠,每个试剂发作需要十二小时,问最短需要多少时间能找出有毒的试剂
解法:
3只小鼠能组成8种状态
第一只喂食【1、3、5、7】四支试剂
第二只喂食【2、3、6、7】四支试剂
第三只喂食【4、5、6、7】四支试剂
1 | # [3、2、1] |
可以看出十二个小时就可以找出有毒的试剂
汉明码
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)
汉明码需要几个检测位有个公式: 2k≥n+k+1, 其中k为检测位的个数,n为原始数据的位数
假设要传输一个4位数据0011,那么我们添加3个检测位即可,它们分别放在第20,21,22即第1,2,4位,如图
那么各检测位Ci承担的检测任务为
C1检测的g1小组包含第1,3,5,7···位,其二进制编码为X…XXX1
C2检测的g2小组包含第2,3,6,7···位,其二进制编码为X…XX1X
C3检测的g3小组包含第4,5,6,7···位,其二进制编码为X…X1XX
如果按照配偶原则配置汉明码的话,要保证检测的小组中1的个数为偶数,则有
C1 =3⨁5⨁7=1
C2=3⨁6⨁7=0
C3=5⨁6⨁7=0
那么得到的7位汉明码则为1000011,若经传输以后数据变为1000001,有1位数据发送改变,可以进行纠错
D1 =1⨁3⨁5⨁7=0
D2=2⨁3⨁6⨁7=1
D3=3⨁5⨁6⨁7=1
则出错位数为D3D2D1=110=6,则可知道是第6位数据出错,纠错以后可知原始的4位数据应该是0011
D3D2D1能组成8种状态
1 | # [3、2、1] |
至此可以看出,这道经典面试题的解答思想和汉明码的校验过程是高度相似的,三只小白鼠喝的试剂分别就是三个检测小组,第一只小白鼠喝的1、3、5、7号试剂,二进制编码就是XX1,第二只小白鼠喝的2、3、6、7号试剂,二进制编码就是X1X,第三只小白鼠喝的4、5、6、7号试剂,二进制编码就是1XX,通过代表三个检测小组的三只小白鼠喝了试剂以后死亡与否来找出是哪个试剂有毒,这个过程实际上与汉明码的校验过程高度相似,思想实际上是相同的