1. Gray码介绍

Gray码是一个长度为2N的序列,序列中无相同元素,每个元素都是长度为N位的(0,1)串,相邻元素恰好只有一位不同。Gray的特点如下图所示:

此图片来源于以下链接: https://blog.csdn.net/hummingbird0/article/details/105100327.

2.构造方法

设n位Gray码的序列为 G ( n ) G(n) G(n),其倒序列为 G − 1 ( n ) G^{-1}(n) G−1(n),例如 G ( 2 ) = { 00 , 01 , 11 , 10 } G(2)= \left\{ 00,01,11,10\right\} G(2)={00,01,11,10},则 G − 1 ( 2 ) = { 10 , 11 , 01 , 00 } G^{-1}(2)= \left\{ 10,11,01,00\right\} G−1(2)={10,11,01,00};从上图中不难发现以下规律: G ( n ) = 0 G ( n − 1 ) + 1 G − 1 ( n − 1 ) G(n)=0G(n-1)+1G^{-1}(n-1) G(n)=0G(n−1)+1G−1(n−1)
从而实现 G ( n − 1 ) G(n-1) G(n−1)到 G ( n ) G(n) G(n)的转化,而初始边界条件 G ( 1 ) = { 0 , 1 } G(1)= \left\{ 0,1\right\} G(1)={0,1}已知。所以,构造Gray码的代码如下:

#include <iostream>
using namespace std;//构造Gray码 特点是当n大于20后特别占内存
int Gray(int n)
{if (n < 1) return -1;  //输入检测string* gray = new string[pow(2, n)]; //用字符串数组存储Gray码int x = 0;gray[0] = "0"; //边界条件gray[1] = "1";for (int i = 2; i <= n; i++) {x = pow(2, i); //Gray码的规模for (int m = pow(2, i - 1); m <= (pow(2, i) - 1); m++)gray[m] = "1" + gray[x - m - 1]; for (int j = 0; j <= (pow(2, i-1) - 1); j++)gray[j] = "0" + gray[j];      }for (int i = 0; i < pow(2, n); i++) {cout << gray[i] << " ";}//delete gray;//????????????????为什么此处会报错return 0;
}int main()
{int n;cout << "请输入一个正整数: ";cin >> n;Gray(n);return 0;
}

此代码用一个字符串数组来存储2n规模的Gray码,显然空间复杂度为O(2n),因此当n比较大的时候特别占内存,呈指数级增长,例如n=25时,就可占4.5GB的内存,当n=29时,会占22GB的运行内存。若有解决此弊端的方法感谢留言告之。

构造Gray码(格雷码)相关推荐

  1. Gray Code(格雷码) C++多方法实现

    简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循环 ...

  2. 8421BCD码 5421BCD码 余三码 格雷码 余三循环码之间的关系,转换以及简易方法

    8421BCD码 5421BCD码 余三码 格雷码 余三循环码之间的关系,转换以及简易方法 1. 有权码和无权码的包括 2.各种码值的介绍 8421码的简介 8421码又称为BCD码,是十进代码中最常 ...

  3. LeetCode Gray Code 格雷码

    题意:提供一个数字n,代表二进制的个数,那么就有2的n次方个可能性了,从0到2^n-1.将其转成格雷码,再直接将二进制的格雷码按二进制的读法变成整数,装在vector容器中返回,要有序(否则你直接将0 ...

  4. 格雷码基础和生成的几种方法

    1 格雷码: 1.1 格雷码引言: 在数字系统中,常要求代码按一定顺序变化. 在机器视觉里面,编码结构光也是按照一定的顺序进行变化,最常用的就是Binary,但是,二进制的纯粹的编码,由于二进制的进制 ...

  5. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  6. 3位格雷码的顺序编码_FPGA 设计之 跨时钟域(四 - 格雷码)

    上一篇文章总结了四种常用的多比特跨时钟域的设计.这篇我们主要来看一下 格雷码,文章目录如下: 什么是格雷码 格雷码转二进制码 二进制码转格雷码 N比特格雷码转N-1比特格雷码 什么是格雷码 ? A G ...

  7. 数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现

    数字电路基础知识--格雷码和二进制码的转换的算法和Verilog实现 关于数字电路中的码制问题在这篇博客中已经做了详细分析, 数字电路基础知识--数字IC中的进制问题(原码,反码,补码以及各进制的转换 ...

  8. 结构光之格雷码编码加相移算法详解与实现(多种编码程序)

    格雷码+相移法既可以减少格雷码的编码位数,加快解码速度,也可以弥补单纯的相移法和格雷码法的对不连续位置难以重建的缺点. 操作过程如下: 采用格雷码与相移结合的时间编码方法,具体的编码方法为:首先向被测 ...

  9. 格雷码与普通二进制码的相互转换——学习笔记

    文章目录 格雷码 普通二进制码转换成格雷码 格雷码转换成普通二进制码 进一步 Reference 文章中内容与图片大部分来自Reference,本文只是以方便自己理解的方式进行整理. 格雷码 在一组数 ...

  10. 4位格雷码的顺序编码_格雷码那点事——递归非递归实现

    简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循环 ...

最新文章

  1. git或者ssh出错 fatal:open /dev/null or dup failed: No such file or directory、弹出mitty.dump文件
  2. 如何选择正确的标签?
  3. 我的软件工程之路(二)
  4. C++ 中 new 操作符内幕:new operator、operator new、placement new
  5. 解决Shockwave flash在谷歌浏览器上崩溃的问题
  6. Dell做RAID配置图文全教程
  7. 相称显微镜下细胞群体跟踪
  8. 企业直播活动策划方案怎么做
  9. Sketchup2019安装包安装教程
  10. 微信小程序 自定义日期选择器
  11. java商城答辩_毕业答辩-基于Java的网上购物商城的设计与实现.ppt
  12. 甘超波:NLP价值观
  13. JQuery 遍历List,数组,对象
  14. 完整的高性能PHP应用服务器appserver
  15. Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用
  16. tensorflow学习笔记-bili莫烦
  17. incident用法_“我出事故了”书到用时方恨少,事故用“incident”还是“accident”?...
  18. mathematica结果c语言形式,Mathematica表达式及其运算规则
  19. python适合做嵌入式开发吗_python可以做嵌入式吗
  20. 2023年苹果IOS开发者证书申请(已实测准确)

热门文章

  1. XGen for iOS789 简明 教程
  2. 数据可视化—复杂网络关系图的绘制
  3. 小王带你了解如何配置静态ip
  4. c语言停车场程序设计,停车场模拟管理程序的设计与实现,高手指教
  5. Python实现 — —水仙花数(一问多解)
  6. 深度学习自学第四周:近几年的经典神经网络结构
  7. 7、Instant-ngp
  8. 训练赛一:bfs广搜题目 CF115B Lawnmower
  9. 图像分割:阈值获取方法总结
  10. ssm物业报修管理系统的设计与实现毕业设计源码111024