格雷码Gray的分治构造算法
格雷码Gray的分治构造算法

算法设计与分析课程设计题目:Gray码的分治构造算法专业:网络工程班级:学号:姓名:计算机工程系2012年11 月16 日一、算法问题描述Gray 码是一个长度为n 2的序列。
序列中无相同元素,每个元素都是长度为n 位的串,相邻元素恰好只有1位不同。
用分治策略设计一个算法对任意的n 构造相应的Gray 码。
二、算法问题形式化表示用分治算法构造Gray 码的问题可形式化地表示如下:n 位Gray 码=⎩⎨⎧=>-时)(当或时)”(当”或“位填“在第码位1n ,101n 10n ,Gray )1(n 三、期望输入与输出输入:以(0,1)串为例,输入元素的宽度n输出:得到长度为n 2的Gray 码序列四、算法分析与步骤描述n 位Gray 码可由(n-1)位Gray 码及1位“0”或“1”组成。
因此,最主要的工作是生成(n-1)位的Gray 码,这样,就将问题的规模n 缩小为(n-1),元素的个数由n 2缩小为12-n 个,从而达到简化问题的目的。
同时可以利用这12-n 个元素构造全部的n 2个元素。
具体算法实现中,参数n 表示Gray 码的宽度,参数b 表示元素个数,数组arr[][]用来存储生成的Gray 码。
算法如下:void graycode(int n, int b, int arr[][]) {if (n == 0)return ;for (int i = 0; i < b / 2; i++) {arr[i][n - 1] = 0; //若宽度大于1,则在前一半码字的第n 位添加"0"arr[b - i - 1][n - 1] = 1; //在一半码字的第n 位添加"1",//如此生成了目标码字的最高位}graycode(n - 1, b / 2, arr); //接着生成宽度为(n-1)的Gray 码,//填写在目标码字的最高部分for (int k = b / 2; k < b; k++)//再将(n-1)位的Gray 码逆序后,//填入目标码字的低半部分for (int j = 0; j < n - 1; j++)arr[k][j] = arr[b - k - 1][j];}五、问题实例及算法运算步骤定义序列中每个元素的位数称为元素的“宽度”。
C++数学与算法系列之格雷码

C++ 数学与算法系列之认识格雷码1. 前言程序中所涉及到的任何数据,计算机底层均需转换成二进制数值后方可存储,这个过程也称为编码。
反之,把底层二进制数据转换成应用数据称为解码,不同的数据类型需要不同的编(解)码方案,如音频数据编码、视频数据编码、图形数据编码……即使是同类型的数据,根据不同的应用场景,也有多种编码方案可选。
如字符编译就有ASCII、UTF-8、哈夫曼编码以及本文将要讲解的格雷码。
讲解格雷码之前,首先了解一下格雷码的定义:•对数据编码后,若任意两个相邻的码值间只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。
•由于最大数与最小数之间也仅只有一位数不同,即首尾相连,又称循环码或反射码。
表中典型格雷码具有代表性,一般说格雷码就是指典型格雷码,它可从自然二进制码转换而来。
Tips:格雷码是一种变权码,每一位码没有固定的大小,很难直接进行比较大小和算术运算。
2. 编码方案2.1 递归实现这种方法基于格雷码是反射码的事实,可以对直接使用递归算法构造。
流程如下:•1位格雷码有两个编码。
•(n+1)位格雷码中的前2^n个编码等于n位正序格雷码的前面加0。
•(n+1)位格雷码中的后2^n个编码等于n位逆序格雷码的前面加1。
编码实现:#include <iostream>#include <vector>using namespace std;/**实现格雷编码*/vector<string> grayCode(int num) { //存储格雷码vector<string> vec;if(num==1) {//出口:1位格雷码是已知的vec.push_back("0");vec.push_back("1");return vec;}//得到低位格雷码vector<string> vec_= grayCode(num-1);//对低位格雷码正向遍历,添加前缀 0vector<string>::iterator begin=vec_.begin();vector<string>::iterator end=vec_.end();for(; begin!=end; begin++) {vec.push_back("0"+*begin);}//对低位格雷码反向遍历,添加前缀 1vector<string>::reverse_iterator rbegin=vec_.rbegin(); vector<string>::reverse_iterator rend=vec_.rend();for(; rbegin!=rend; rbegin++) {vec.push_back("1"+*rbegin);}return vec;}//测试int main(int argc, char** argv) {vector<string> vec=grayCode(4);cout<<"4 位格雷码:"<<endl;for(int i=0; i<vec.size(); i++) {cout<<vec[i]<<endl;}return0;}输出结果:4位格雷码:00000001001100100110011101010100110011011111111010101011100110002.2异或转换异或转换可以直接把n位二进制数字编码成对应的n位格雷码。
编码器格雷码的计算

格雷码格雷码(Gray code),又叫循环二进制码或反射二进制码在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。
而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。
它在任意两个相邻的数之间转换时,只有一个数位发生变化。
它大大地减少了由一个状态到下一个状态时逻辑的混淆。
另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。
下表为几种自然二进制码与格雷码的对照表:┌────┬──────┬───┬────┬──────┬────┐│十进制数│自然二进制数│格雷码│十进制数│自然二进制数│格雷码│├────┼──────┼───┼────┼──────┼────┤│0 │0000 │0000 │8 │1000 │1100 │├────┼──────┼───┼────┼──────┼────┤│1 │0001 │0001 │9 │1001 │1101 │├────┼──────┼───┼────┼──────┼────┤│2 │0010 │0011 │10 │1010 │1111 │├────┼──────┼───┼────┼──────┼────┤│3 │0011 │0010 │11 │1011 │1110 │├────┼──────┼───┼────┼──────┼────┤│4 │0100 │0110 │12 │1100 │1010 │├────┼──────┼───┼────┼──────┼────┤│5 │0101 │0111 │13 │1101 │1011 │├────┼──────┼───┼────┼──────┼────┤│6 │0110 │0101 │14 │1110 │1001 │├────┼──────┼───┼────┼──────┼────┤│7 │0111 │0100 │15 │1111 │1000 │└────┴──────┴───┴────┴──────┴────┘一般的,普通二进制码与格雷码可以按以下方法互相转换:二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR)(/lemma-php/dispose/view.php/379209.htm),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).数学(计算机)描述:原码:p[0~n];格雷码:c[0~n](n∈N);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.编码:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];解码:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).Gray Code是由贝尔实验室的Frank Gray在20世纪40年代提出的(是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的),用来在使用PCM(Pusle Code Modulation)方法传送讯号时避免出错,并于1953年3月17日取得美国专利。
格雷码的编码、解码

格雷码的编码、解码摘要:1.格雷码的概述2.格雷码的编码方式3.格雷码的解码方式4.格雷码的应用领域正文:1.格雷码的概述格雷码,又称为Gray Code,是一种编码方式,用于二进制数据的转换。
格雷码最大的特点是任意两个相邻的码之间只有一个位不同,这种编码方式可以减少错误传输的概率,因此在实际应用中具有较高的可靠性。
2.格雷码的编码方式格雷码的编码方式分为两种:一种是自然格雷码,另一种是循环格雷码。
自然格雷码是一种最基本的格雷码,其编码方式为:从0 到255,总共256 个编码,其中0 和255 为特殊的起始和结束码。
其余的254 个编码中,任意两个相邻的编码只有一个位不同。
循环格雷码是自然格雷码的一种扩展,其编码方式为:从0 到63 共有64 个编码,其中0 和63 为特殊的起始和结束码。
其余的62 个编码中,任意两个相邻的编码只有一个位不同。
循环格雷码的主要应用是在具有多个位数的数据传输中,通过重复使用自然格雷码来表示更多的数据位。
3.格雷码的解码方式格雷码的解码方式与编码方式相对应,自然格雷码和循环格雷码也有各自的解码方式。
在解码过程中,需要根据起始和结束码来判断编码的范围,然后根据相邻编码的差异来还原原始的二进制数据。
4.格雷码的应用领域格雷码在实际应用中具有广泛的应用,主要体现在以下几个领域:(1)数据传输:由于格雷码具有较高的抗干扰性和错误传输的概率,因此在数据传输领域有着广泛的应用,特别是在需要高可靠性的数据传输场景中。
(2)存储技术:格雷码在存储技术中也有广泛的应用,例如在硬盘驱动器、光盘等存储设备中,采用格雷码来表示数据可以提高数据的可靠性和存储效率。
(3)加密技术:格雷码在加密技术中也有一定的应用,由于格雷码具有较高的编码效率和解码效率,因此在某些加密算法中采用格雷码来加密和解密数据。
(4)通信技术:在通信技术中,格雷码也有广泛的应用,例如在数字通信、光通信等领域,采用格雷码来表示数据可以提高通信的可靠性和效率。
2009.1算法设计与分析课程期末试卷-A卷(自测 )

华南农业大学期末考试试卷(A卷)2008学年第一学期考试科目:算法分析与设计考试类型:(闭卷)考试时间:120分钟学号姓名年级专业一、选择题(20分,每题2分)1.下述表达不正确的是。
A.n2/2 + 2n的渐进表达式上界函数是O(2n)B.n2/2 + 2n的渐进表达式下界函数是Ω(2n)C.logn3的渐进表达式上界函数是O(logn)D.logn3的渐进表达式下界函数是Ω(n3)2.当输入规模为n时,算法增长率最大的是。
A.5n B.20log2n C.2n2D.3nlog3n3.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是。
A.T(n)= T(n – 1)+1,T(1)=1 B.T(n)= 2n2C.T(n)= T(n/2)+1,T(1)=1D.T(n)= 3nlog2n4.在棋盘覆盖问题中,对于2k×2k的特殊棋盘(有一个特殊方块),所需的L型骨牌的个数是.A.(4k– 1)/3 B.2k /3 C.4k D.2k5.在寻找n个元素中第k小元素问题中,若使用快速排序算法思想,运用分治算法对n个元素进行划分,应如何选择划分基准?下面答案解释最合理。
A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。
但不同方法,算法复杂度上界可能不同6.现在要盖一所邮局为这9个村庄服务,请问邮局应该盖在才能使到邮局到这9个村庄的总距离和最短. A .(4.5,0)B .(4。
5,4。
5)C .(5,5)D .(5,0)7. n 个人拎着水桶在一个水龙头前面排队打水,水桶有大有小,水桶必须打满水,水流恒定.如下说法不正确?A .让水桶大的人先打水,可以使得每个人排队时间之和最小B .让水桶小的人先打水,可以使得每个人排队时间之和最小C .让水桶小的人先打水,在某个确定的时间t 内,可以让尽可能多的人打上水D .若要在尽可能短的时间内,n 个人都打完水,按照什么顺序其实都一样8. 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。
OpenJudge算法设计与分析习题解答

3、鸡兔同笼
描述
一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼子里面脚的 总数 a,问笼子里面至少有多少只动物,至多有多少只动物。
输入
一行,一个正整数 a (a < 32768)。
输出
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格 分开。 如果没有满足要求的答案,则输出两个 0,中间用一个空格分开。
样例输入
45 2 3 2 1
样例输出
1 BeiJu 1 BeiJu 源代码: #include <stdio.h> #include <string.h> int b[ 222 ]; int a[ 222 ]; int n, m;
int main() {
scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++ ){
if(lef >= righ) { return ;
} int mid = lef + (righ - lef) / 2; reSeq(seq, lef, mid);
reSeq(seq, mid + 1, righ); int totalSize = righ - lef + 1; long long tmp[totalSize]; int n = lef; int m = mid + 1; int i = 0; while(n <= mid || m <= righ) {
输入
无输入
输出
按照饭量大小输出 3 人顺序,比如: ABC
格雷码二进制码转换电路

格雷码二进制码转换电路格雷码(Gray code),又称格雷码二进制码转换电路,是一种特殊的二进制编码方式。
它的特点是相邻的两个数值仅有一位二进制数发生变化,适用于数字和模拟电路中的编码和传输。
格雷码的起源可以追溯到19世纪,由法国数学家弗兰索瓦·格雷(François Gray)发明。
他的目的是设计一种编码方式,可以减少在数字传输过程中由于噪声、抖动等原因引起的误差。
在传统的二进制编码方式中,相邻的两个数值之间可能会发生多个二进制位的变化,这样在数字传输中就容易引起误差。
而格雷码通过仅改变一位二进制数来表示相邻的数值,可以有效地降低传输误差的风险。
格雷码的转换电路由多个逻辑门组成,常见的实现方式有反馈式和非反馈式两种。
反馈式格雷码转换电路使用触发器和逻辑门组成,适用于需要连续转换的应用场景。
非反馈式格雷码转换电路则使用逻辑门组成,适用于只需要单次转换的应用场景。
格雷码转换电路的核心是通过逻辑门的组合实现码字之间的变换。
逻辑门的输入信号由当前码字和目标码字决定,通过逻辑运算得到输出信号。
常见的逻辑门有与门、或门、非门等,它们可以实现不同的逻辑运算。
格雷码转换电路的功能包括格雷码到二进制码的转换和二进制码到格雷码的转换。
格雷码到二进制码的转换可以通过逻辑门的组合实现,将格雷码逐位进行异或运算,并与之前的结果进行与运算。
而二进制码到格雷码的转换则可以通过逻辑门的组合实现,将二进制码逐位进行异或运算,得到格雷码。
在数字电路中,格雷码转换电路广泛应用于各种编码器和解码器中。
编码器可以将多个输入信号转换为相应的格雷码输出,解码器则可以将格雷码输入转换为相应的输出信号。
格雷码转换电路还可以用于数字计数器、旋转编码器等应用中。
总结起来,格雷码二进制码转换电路是一种特殊的二进制编码方式,通过逻辑门的组合实现码字之间的变换。
它的应用范围广泛,可以用于数字电路中的编码和传输。
格雷码的特点是相邻的两个数值仅有一位二进制数发生变化,可以减少传输误差的风险。
格雷码的转换

格雷码格雷码(Gray code),又叫循环二进制码或反射二进制码在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。
而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。
它在任意两个相邻的数之间转换时,只有一个数位发生变化。
它大大地减少了由一个状态到下一个状态时逻辑的混淆。
另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。
下表为几种自然二进制码与格雷码的对照表:十进制数自然二进制数格雷码0 0000 00001 0001 00012 0010 00113 0011 00104 0100 01105 0101 01116 0110 01017 0111 01008 1000 11009 1001 110110 1010 111111 1011 111012 1100 101013 1101 101114 1110 100115 1111 1000一般的,普通二进制码与格雷码可以按以下方法互相转换:二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).数学(计算机)描述:原码:p[0~n];格雷码:c[0~n](n∈N);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.编码:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];解码:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).Gray Code是由贝尔实验室的Frank Gray在20世纪40年代提出的(是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的),用来在使用PCM(Pusle Code Modulation)方法传送讯号时避免出错,并于1953年3月17日取得美国专利。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析
课程设计
题目:Gray码的分治构造算法
专业:网络工程
班级:
学号:
姓名:
计算机工程系
2012年11 月16 日
一、算法问题描述
Gray 码是一个长度为n 2的序列。
序列中无相同元素,每个元素都是长度为n 位的串,相邻元素恰好只有1位不同。
用分治策略设计一个算法对任意的n 构造相应的Gray 码。
二、算法问题形式化表示
用分治算法构造Gray 码的问题可形式化地表示如下:
n 位Gray 码=⎩
⎨⎧=>-时)(当或时)”(当”或“位填“在第码位1n ,101n 10n ,Gray )1(n 三、期望输入与输出
输入:以(0,1)串为例,输入元素的宽度n
输出:得到长度为n 2的Gray 码序列
四、算法分析与步骤描述
n 位Gray 码可由(n-1)位Gray 码及1位“0”或“1”组成。
因此,最主要的工作是
生成(n-1)位的Gray 码,这样,就将问题的规模n 缩小为(n-1),元素的个数由n 2缩小
为12-n 个,从而达到简化问题的目的。
同时可以利用这12-n 个元素构造全部的n 2个元素。
具体算法实现中,参数n 表示Gray 码的宽度,参数b 表示元素个数,数组arr[][]用来存储生成的Gray 码。
算法如下:
void graycode(int n, int b, int arr[][]) {
if (n == 0)
return ;
for (int i = 0; i < b / 2; i++) {
arr[i][n - 1] = 0; //若宽度大于1,则在前一半码字的第n 位添加"0"
arr[b - i - 1][n - 1] = 1; //在一半码字的第n 位添加"1",
//如此生成了目标码字的最高位
}
graycode(n - 1, b / 2, arr); //接着生成宽度为(n-1)的Gray 码,
//填写在目标码字的最高部分
for (int k = b / 2; k < b; k++)//再将(n-1)位的Gray 码逆序后,
//填入目标码字的低半部分
for (int j = 0; j < n - 1; j++)
arr[k][j] = arr[b - k - 1][j];
}
五、问题实例及算法运算步骤
定义序列中每个元素的位数称为元素的“宽度”。
下面给出一组宽度为4的Gray码,并以此为例,对它的编码规律进行分析。
如下图,对于宽度为4的Gray码,除最高位以外,虚线①的上下两侧是对称的,对称的两组码字恰好均是宽度为3的Gray码,并且虚线①上方最高位全为“0”,下方全为“1”;对于宽度为3的Gray码,除最高位以外,虚线②的上下两侧也是对称的,对称的两组码字恰好均是宽度为2的Gray码,并且虚线②上方最高位同样全为“0”,下方全为“1”。
同理,向下推广至Gray码宽度为2和1,向上推广至宽度为5、6、……。
可以发现,这种规律对于任意宽度的Gray码都是适用的。
2-n 这样,总结出Gray码序列的构造规律,即宽度为n的Gray码,共有n2个元素,前1
2-n个元素可由之前生成的个元素可由宽度为(n-1)的Gray码和第n位的“0”构成,后1
经过逆序的(n-1)位的Gray码和第n位的“1”构成。
六、算法运行截图
七、算法复杂度分析
这是一个基于分治思想的算法,利用Gray码具有的自对称性,将问题的规模不断缩小,从而实现Gray码的生成。
若用T(n)表示生成宽度为n的Gray码所需要的时间复杂度,则整个算法的时间复杂度可表示为:
T(n)=⎩⎨⎧>⋅+-=)1(),2()1()
1(),(n n O n T n n O n 解此递归式可得:T(n)=O(n n 2⋅)。
算法的空间复杂度为:O(n n 2⋅)。