文档详情

第二章第9题程序报告.doc

发布:2017-12-09约1.42千字共4页下载文档
文本预览下载声明
算法设计与分析第二章第9题 构造Gray码算法 姓名:高煜 学号:122103111 班级:12计科2班 问题描述 Gray码又叫循环二进制码或反射二进制码,在数字系统中只能识别0和1,各种数据要转换成二进制码才能进行处理。Gray码是一个长度为2的序列。序列中无相同元素,每个元素都是长度为n位的串,相邻元素恰好只有1位不同。用分治策略设计一个算法,对任意的n构造相应的Gray码。 2.分治思想 在我们这个程序里,我们用分治法构造Gray码。分治是一种重要算法分析的方法。分治的基本思想就是我们将一个复杂的问题分解为两个或两个以上较小的问题,这些问题相互独立而且还与原问题是相同或相似的。递归的解这些小的问题,然后将各个小的问题的解合并或简单运算得到原来复杂的问题的解。 3.公式 当n=1 时的GRAY码为:0 ,1当=2 时的GRAY码为:00,01,11,10当=3时的GRAY码为:000,001,011,010,110,111,101,100;从上面的简单情形可以看出G(n)的构造规律:G(n+1)=0G(n)1G1(n)其中G1(n)的第一个n位串相同,可用数学归纳法证明G(n)的上述构造规律。Gray码,除最高位以外,虚线①的上下两侧对称的,对称的两组码恰好是宽度为3的Gray码,虚线①上方最高位全为0,下方全是1;对于宽度为3的Gray码,除最高位以外,虚线②上下两侧也是对称的,对称两组码恰好是宽度为2的Gray码,并且虚线②上方最高位全为0,下方全为1。同理,规律对于任意宽度的Gray码都适用。总结出Gray码的构造规律:即宽度为n的Gray码,共有2n个元素,前2n-1个元素可由宽度为n-1的Gray码和第n位的0构成,后2n-1元素可由之前经过逆序的(n-1)位的Gray码和第n位的组成的。 4.关键代码 void Gray( int a, int b, int ** sz) { if(a==1) return; for(int i = 0; i a/2 ; i++) { sz [i][b-1] = 0;//上半部分赋值为0 sz [a-i-1][b-1]=1; //下半部分赋值为1 } Gray(a/2,b-1,sz);//递归调用,生成列数为b-1的Gray码,填写高的半部分 for(int k = a/2; ka; k++)//将(n-1)位的Gray码逆序后,填入目标码字的低的半部分 for( int j =0; jb-1; j++) sz [k][j]= sz [a-k-1][j]; } 5.调试遇到的问题 输入宽度较小时,可以很快的出结果,但输入到20多时,计算量就已经相当大了,以至于我输入到23的时候,我的笔记本电脑直接崩溃了。其他的也没什么问题就是把一些有关的量忘了定义,总之,如果把递归规律找出来,其实程序很好写的。 6.结果分析 输入的宽度n较小时,可以很快的出结果,但输入到20多时,计算量就已经相当大了,耗费的时间也多了,以至于我输入到23的时候,我的笔记本电脑直接崩溃了。分析发现Gray码具有对称性,算法的时间复杂度是O(n ·2n)。 我觉得算法有待提高。
显示全部
相似文档