二维码缺了一角,为什么还能扫出来?
你一定遇到过:一张二维码被印糊了、贴破了,甚至缺了个角,手机"嘀"一下照样扫得出来。它怎么知道那些残缺、出错的地方,原本该是什么?
秘密在于,数据在存进去的时候,就被故意留了"安全距离"。要讲清这件事,得先有一把度量"两串数据差多远"的尺子——汉明距离。
一把数"差几位"的尺子
取两串等长的比特(0 和 1),把它们逐位对齐,一位位地比。不一样的位有几个,汉明距离就是几。
比如 1011010 和 1110010:第 2、3、4 位不同,其余相同,汉明距离就是 3。就这么简单——它数的不是"差多少",而是"差几处"。
把每个串看成一个"顶点"
这里有个特别漂亮的几何图像。
想象只有 3 位的串,一共 种:000、001、…、111。把它们放到一个正方体的 8 个顶点上,规则是:只差一位的两个串,用一条棱连起来。
于是 000 和 001 相邻(差第 1 位),000 和 011 隔一个顶点……你会发现:
两个串的汉明距离,正好等于在这个立方体上、从一个顶点走到另一个顶点要经过的最少棱数。
000 走到 111,每步只能翻一位,无论怎么走都至少要 3 步——它们的汉明距离就是 3。串再长一点,就是 维的"超立方体",道理一模一样。
距离够远,就能纠错
回到二维码。如果两个合法"码字"的汉明距离只有 1,那错一位就会被认成另一个,神不知鬼不觉。但如果我们规定:所有合法码字两两之间,汉明距离至少为 ,情况就大不同了。
设码字集合的最小汉明距离为 ,那么:
| 能力 | 条件 | 直觉 |
|---|---|---|
| 检测错误 | 最多能查出 位错 | 错得还没多到"撞上"另一个码字 |
| 纠正错误 | 最多能纠 位错 | 出错后离原码字仍比离别的近 |
每个码字像被一个"安全球"罩住,球与球不重叠。只要出错没超出半径,把它"吸附"回最近的码字就还原了——这正是二维码缺角仍能识别的原因。
它藏在哪些地方
- 纠错码:二维码、CD/DVD、卫星与深空通信、内存 ECC,全靠它对抗噪声。
- 生物信息:比较等长 DNA / 蛋白质序列的差异。
- 机器学习:哈希去重、相似图片检索里衡量编码的接近程度。
一串看似冰冷的 0 和 1,其实住在一个高维立方体里——而"距离",就是它们之间隔了几次翻转。