Hamming codes

今天 \(\text{3B1B}\) 更新了 , 而且是 \(\text{Hamming codes}\)
真的很有趣的这个东西 , 所以我准备写一篇。
\(\text B\) 站有他的原版视频 ,
以及我学会了 \(\text{BCH codes}\) 后会再写一篇。

给你一个长为 \(n\)\(01\) 串 , 然后让你记录 \(k\) 个数字 ,
随后我将此 \(01\) 串的一个数字改变 , 要求你用你的 \(k\) 个数字确定我改变的数字的位置。

最简单的方法 , 分块。
这样子叫的核心其实跟 \(\text{3B1B}\) 所说的将串变为矩阵没有什么区别 ,
这里就不把它变成矩阵了 , 直接是线性的 , 分块。

这里有个叫奇偶校检法的东西 ,
假如你有一个串 \(01101101\) , \(1\) 的个数是奇数个 , 那么你可以用 “\(1\)” 来代表这一段数。
如果是偶数个的话 , 给个 \(0\) 就行。
其实就是让这一段数的 \(1\) 的个数变成偶数个而已。
校检的时候就直接判断这一段的 \(1\) 的个数是否为偶数个就行 ,
这样子仅能判断“一段”数字是否发生错误
(其实没啥用 , 下文我只需要用某个数字来代表这段数时候正确即可)

然后分块 , 假如是一个矩阵 , (\(n\) 的数列变为 \(\sqrt{n}*\sqrt{n}\) 的矩阵)
那么是不是只要判断哪一列或者哪一行错了就可以找到那个改变数的位置 ?
我们只需要记录 \(2*\sqrt{n}\) 即能找到任意一个错误位置。
这里我们假如 \(x_i\) 代表第 \(i\) 列是否正确 , \(y_i\) 代表第 \(i\) 行是否正确。

好 , 把整个矩阵展开 , 变为一个数列。
想象一下第二行的数接到了第一行的尾巴上 ,
也就是 \((t,1\)~\({n^{\frac 1 2}}) \implies (1,(t-1)*n^{\frac 1 2}+1\)~\(t*n^{\frac 1 2})\)
那列的 \(x_i\) 还是记录那一段 \(n^{\frac 1 2}\) 的正确性 ,
然而 \(y_i\) 就不是了 , 而是记录每一段的第 \(i\) 个数的组合的正确性 ,
而这就是分块。

好 , 接下来是 \(\text{hamming codes}\)
假如不是分块 , 是一个线段树会怎么样 ?

假如我们记录正确性是这样子的 : 括号代表元素的正确性。

                 (n1,n2,n3,n4,n5,n6,n7,n8)
                    /                 \
       (n1,n2,n3,n4)                  (n5,n6,n7,n8)
       /           \                  /           \
  (n1,n2)         (n3,n4)         (n5,n6)         (n7,n8)
  /     \        /      \        /       \       /      \
n1      n2      n3      n4      n5      n6      n7      n8

那我们岂不是要记录 \(n-1\) 个数字 ?
不可能 , 不可能那么傻。
我们每一层都记录两个数字即可 , 第一个数字是奇数叶的正确性 , 第二个数字是偶数叶的正确性 , 如下图。

第一层 : 奇数叶 : (n1,n2,n3,n4,n5,n6,n7,n8) | 偶数叶 : 无
第二层 : 奇数叶 : (n1,n2,n3,n4)             | 偶数叶 : (n5,n6,n7,n8)
第三层 : 奇数叶 : (n1,n2,n5,n6)             | 偶数叶 : (n3,n4,n7,n8)
第四层 : 奇数叶 : (n1,n3,n5,n7)             | 偶数叶 : (n2,n4,n6,n8)

查找的时候仍然是像线段树那样的二分 , 不过记录的东西少了。

比如 , 我 n4 错了。
那么显然 (n1,n2,n3,n4,n5,n6,n7,n8) 是错的。
接着查到 (n1,n2,n3,n4) 是错的 , 往左走。
接着查到 (n3,n4,n7,n8) 是错的 , 往右走。
再接着查到 (n2,n4,n6,n8) 是错的 , 往右走。
左右右 , 到了 n4 的位置。

这就是我对 \(\text{hamming codes}\) 的理解 , 从矩阵到分块到线段树一步一步推出 ,
不需要用二进制来理解 , 那种东西容易烦。

当然这个只需要 \(2 \log n\) (也就是 \(\log n^2\)) 的空间储存 ,
但也只能求出一个错误的位置 ,
不过不失其优雅。
学完可以纠多个错的 \(\text{BCH}\) 后再来写!

posted @ 2020-10-04 20:27  _ARFA  阅读(97)  评论(0编辑  收藏  举报