首页 > 代码库 > 算法:用分治法设计gray码
算法:用分治法设计gray码
问题描述:
Gray码是一个长度为2n的序列。序列中无相同的原图,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。
算法设计:
n=1时,Gray码:0,1
n=2时,Gray码:00,10, 11,01
n=3时,Gray码:000,010,011,001,101,111,110,100
n=4,时,Gray码:0000,0010,0011,0001,0101,0111,0110,0100, 1100,1110,1111,1101,1001,1011,1010,1000
从上面可以看出如下规律:从n=2开始,每个n的Gray码由两部分组成。后一位的Gray码可以从前一位的Gray码求出,即,在n的Gray码的前半部分是n-1的所有Gray码顺次在前面加0得到;n的Gray码的后半部分是n-1的所有Gray码逆序在前面加1得到。
实现:
import java.awt.*; import javax.swing.*; import java.math.*; public class gray { public static void main(String args[]) { String []graycode; int n,pn; String str=JOptionPane.showInputDialog("请输入n:"); n=Integer.parseInt(str); pn=(int)Math.pow(2,n); graycode=new String[pn]; for(int l=0;l<pn;l++) { graycode[l]=""; } code(n,pn,graycode); } static void code(int n,int pn,String graycode[]) { if(0==n) { System.out.print("输入错误!"); } else if(1==n) { graycode[0]="0"; graycode[1]="1"; } else { int t=1; int len=1; while(t<pn) { t=2*t; len++; for(int i=0;i<t/2;i++) { graycode[i]="0"+graycode[i]; } for(int j=t;j>t/2;j--) { graycode[j-1]="1"+graycode[t-j].substring(1,len-1); } } } for(int m=0;m<pn;m++) { System.out.printf("%3d",m); System.out.print("的格雷码:"); System.out.println(graycode[m]); } } }
算法:用分治法设计gray码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。