/汉明距离
演示中
1

两串等长比特逐位对比,高亮不同的位

数论

汉明距离

二维码缺了一角,为什么还能扫出来?

二维码缺了一角,为什么还能扫出来?

你一定遇到过:一张二维码被印糊了、贴破了,甚至缺了个角,手机"嘀"一下照样扫得出来。它怎么知道那些残缺、出错的地方,原本该是什么?

秘密在于,数据在存进去的时候,就被故意留了"安全距离"。要讲清这件事,得先有一把度量"两串数据差多远"的尺子——汉明距离

一把数"差几位"的尺子

取两串等长的比特(0 和 1),把它们逐位对齐,一位位地比。不一样的位有几个,汉明距离就是几。

比如 10110101110010:第 2、3、4 位不同,其余相同,汉明距离就是 3。就这么简单——它数的不是"差多少",而是"差几处"。

把每个串看成一个"顶点"

这里有个特别漂亮的几何图像。

想象只有 3 位的串,一共 23=82^3=8 种:000001、…、111。把它们放到一个正方体的 8 个顶点上,规则是:只差一位的两个串,用一条棱连起来

于是 000001 相邻(差第 1 位),000011 隔一个顶点……你会发现:

两个串的汉明距离,正好等于在这个立方体上、从一个顶点走到另一个顶点要经过的最少棱数

000 走到 111,每步只能翻一位,无论怎么走都至少要 3 步——它们的汉明距离就是 3。串再长一点,就是 nn 维的"超立方体",道理一模一样。

距离够远,就能纠错

回到二维码。如果两个合法"码字"的汉明距离只有 1,那错一位就会被认成另一个,神不知鬼不觉。但如果我们规定:所有合法码字两两之间,汉明距离至少为 dd,情况就大不同了。

设码字集合的最小汉明距离dd,那么:

能力 条件 直觉
检测错误 最多能查出 d1d-1 位错 错得还没多到"撞上"另一个码字
纠正错误 最多能纠 d12\left\lfloor\dfrac{d-1}{2}\right\rfloor 位错 出错后离原码字仍比离别的近

每个码字像被一个"安全球"罩住,球与球不重叠。只要出错没超出半径,把它"吸附"回最近的码字就还原了——这正是二维码缺角仍能识别的原因。

它藏在哪些地方

  • 纠错码:二维码、CD/DVD、卫星与深空通信、内存 ECC,全靠它对抗噪声。
  • 生物信息:比较等长 DNA / 蛋白质序列的差异。
  • 机器学习:哈希去重、相似图片检索里衡量编码的接近程度。

一串看似冰冷的 0 和 1,其实住在一个高维立方体里——而"距离",就是它们之间隔了几次翻转。

同分类推荐
幻方

横竖斜相加,为什么都是 15?