算法:用分治法设计gray码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:用分治法设计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码的主要内容,如果未能解决你的问题,请参考以下文章
六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法