汉明距离


汉明距离

文章插图
汉明距离【汉明距离】汉明距离是使用在数据传输差错控制编码里面的 , 汉明距离是一个概念 , 它表示两个(相同长度)字对应位不同的数量 , 我们以d(x,y)表示两个字x,y之间的汉明距离 。对两个字元串进行异或运算 , 并统计结果为1的个数 , 那幺这个数就是汉明距离 。
介绍汉明距离是以理察·卫斯里·汉明的名字命名的 。在资讯理论中 , 两个等长字元串之间的汉明距离是两个字元串对应位置的不同字元的个数 。换句话说 , 它就是将一个字元串变换成另外一个字元串所需要替换的字元个数 。例如:1011101 与 1001001 之间的汉明距离是 2 。2143896 与 2233796 之间的汉明距离是 3 。"toned" 与 "roses" 之间的汉明距离是 3 。汉明重量汉明重量是字元串相对于同样长度的零字元串的汉明距离 , 也就是说 , 它是字元串中非零的元素个数:对于二进制字元串来说 , 就是 1 的个数 , 所以 11101 的汉明重量是 4 。特性对于固定的长度 n , 汉明距离是该长度字元向量空间上的度量 , 很显然它满足非负、唯一及对称性 , 并且可以很容易地通过完全归纳法证明它满足三角不等式 。如果把a和b两个单词看作是向量空间中的元素 , 则它们之间的汉明距离等于它们汉明重量的差a-b 。如果是二进制字元串a和b , 汉明距离等于它们汉明重量的和a+b或者a和b汉明重量的异或a XOR b 。汉明距离也等于一个n维的超立方体上两个顶点间的曼哈顿距离 , n指的是单词的长度 。给予两个任何的字码 , 10001001和10110001 , 即可决定有多少个相对位是不一样的 。在此例中 , 有三个位不同 。要决定有多少个位不同 , 只需将exclusive OR运算加诸于两个字码就可以 , 并在结果中计算有多个为1的位 。例如:10001001Xor1011000100111000两个字码中不同位值的数目称为汉明距离(Hamming distance)。它的重要性在于如果有两个字码的汉明距离为d的话 , 就需要d的单一位错误已将其中一个字码转换为另一个 。最小汉明距离在一个码组集合中 , 任意两个码字之间对应位上码元取值不同的位的数目定义为这两个码字之间的汉明距离 。即d(x,y)=∑x[i]⊕y[i]这里i=0,1,..n-1 , x,y都是n位的编码 , ⊕表示异或例如:(00)与(01)的距离是1 , (110)和(101)的距离是2 。在一个码组集合中 , 任意两个编码之间汉明距离的最小值称为这个码组的最小汉明距离 。最小汉明距离越大 , 码组越具有抗干扰能力 。下面我们用d表示码组的最小汉明距离 。1. 当码组用于检测错误时 , 设可检测e个位的错误 , 则d>=e+1设有两个距离为d的码字A和B , 如果A出现了e个错误 , 则A变成了以A为圆心 , e位半径的球体表面的码字 。为了能够準确地分辨出这些码字既不是A也不是B , 那幺A误码后变成的球面上的点与B至少应该有一位距离(如果B在球面上或在球面内部则无法分辨出到底B是不是A的错误码) , 即A与B之间的最小距离d>=e+1 。2. 若码组用于纠错 , 设可纠错t个位的错误 , 则d>=2t+1设有码字A和B , 如果A出现了t个错误 , B也出现了t各错误 , 则A码变成以A为圆心 , t为半径的球面上的码字;B码变成以B为圆心 , t为半径的球面上的码字 。为了在出现t个错之后仍能分辨一个码字到底是属于A的错码还是属于B的错码 , A,B为球心的两个球面应该不相交 , 即球心A , B之间距离应该大于2t , 所以d>=2t+1 。3.如果码组用于纠正t个错 , 检测e个错 , 则d>=e+t+1这里e>t , 这种检错纠错方式结合的情况同上述两个情况类似 。当码字出现t个或者小于t个错时 , 系统按照纠错方式工作 。当码字出现超过t个错而小于等于e个错时 , 系统按照检错方式工作;当A出现e个错 , B出现t个错时 , 既要纠正B的错 , 又要发现A的错 , 则以A为球心 , e为半径的球和以B为球心 , t为半径的球应该不相交 , 所以A,B之间的距离应该大于等于e+t+1 , 即d>=e+t+1 。历史及套用汉明距离是以理察·卫斯里·汉明的名字命名的 , 汉明在误差检测与校正码的基础性论文中首次引入这个概念 。在通信中累计定长二进制字中发生翻转的错误数据位 , 所以它也被称为信号距离 。汉明距离更多的用于信号处理 , 表明一个信号变成另一个信号需要的最小操作(替换位) , 实际中就是比较两个比特串有多少个位不一样 , 简洁的操作时就是两个比特串进行异或之后包含1的个数 。汉明距在图像处理领域也有这广泛的套用 , 是比较二进制图像非常有效的手段 。计算一个数字的比特位包含1的个数有个小技巧:value &= value - 1这个运算的结果就是把value最后一个1去掉 , 循环进行运算直到value等于0(所有的1都被去掉)就可以知道vaule拥有多少个1了 。其在包括资讯理论、编码理论、密码学等领域都有套用 。但是 , 如果要比较两个不同长度的字元串 , 不仅要进行替换 , 而且要进行插入与删除的运算 , 在这种场合下 , 通常使用更加複杂的编辑距离等算法 。