格雷码
格雷码是一个二进制数系,其中两个相邻数的二进制位只有一位不同。举个例子,
注意序列的下标我们以
格雷码由贝尔实验室的 Frank Gray 于 1940 年代提出,并于 1953 年获得专利。
构造格雷码(变换)
格雷码的构造方法很多。我们首先介绍手动构造方法,然后会给出构造的代码以及正确性证明。
手动构造
- 翻转最低位得到下一个格雷码,(例如
); - 把最右边的
的左边的位翻转得到下一个格雷码,(例如 );
交替按照上述策略生成
镜像构造
计算方法
我们观察一下
1 |
|
正确性证明
接下来我们证明一下,按照上述公式生成的格雷码序列,相邻两个格雷码的二进制位有且仅有一位不同。
我们考虑
于是我们在计算
证毕。
通过格雷码构造原数(逆变换)
接下来我们考虑格雷码的逆变换,即给你一个格雷码
1 2 3 4 5 |
|
实际应用
格雷码有一些十分有用的应用,有些应用让人意想不到:
位二进制数的格雷码序列可以当作 维空间中的一个超立方体(二维里的正方形,一维里的单位向量)顶点的哈密尔顿回路,其中格雷码的每一位代表一个维度的坐标。格雷码被用于最小化数字模拟转换器(比如传感器)的信号传输中出现的错误,因为它每次只改变一个位。
格雷码可以用来解决汉诺塔的问题。
设盘的数量为
。我们从 位全 的格雷码 开始,依次移向下一个格雷码( 移向 )。当前格雷码的二进制第 位表示从小到大第 个盘子。由于每一次只有一个二进制位会改变,因此当第
位改变时,我们移动第 个盘子。在移动盘子的过程中,除了最小的盘子,其他任意一个盘子在移动的时侯,只能有一个放置选择。在移动第一个盘子的时侯,我们总是有两个放置选择。于是我们的策略如下:如果
是一个奇数,那么盘子的移动路径为 ,其中 是最开始的柱子, 是最终我们把所有盘子放到的柱子, 是中间的柱子。如果
是偶数:格雷码也在遗传算法理论中得到应用。
习题
CSP S2 2019 D1T1 Difficulty: easy
SGU #249 Matrix Difficulty: medium
本页面部分内容译自博文 Код Грея 与其英文翻译版 Gray code。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
本页面最近更新:2023/2/18 07:57:07,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:ouuan, sshwy, StudyingFather, CCXXXI, danni, Early0v0, Enter-tainer, frank-xjh, Henry-ZHR, infiWang, Ir1d, KargathEx, Yanjun-Zhao
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用