首页 > 代码库 > 算法:用分治法设计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码